Nginx 性能优化

Nginx 性能优化

/ 0 评 / 0

Nginx 性能优化

Nginx 运行进程数量及多核充分利用

    nginx.conf 
    -------------------------------------------------------------
    worker_processes 6;  # 默认是auto
    worker_cpu_affinity 000001 000010 000100 001000 010000 100000
  1. top 命令之后 按 1 可以展示出来

    top - 17:16:40 up 22:36,  1 user,  load average: 1.53, 1.29, 1.31
    任务: 381 total,   2 running, 320 sleeping,   0 stopped,   0 zombie
    %Cpu0  : 10.1 us,  3.4 sy,  0.0 ni, 86.2 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
    %Cpu1  :  8.3 us,  5.3 sy,  0.0 ni, 85.1 id,  0.7 wa,  0.0 hi,  0.7 si,  0.0 st
    %Cpu2  :  8.4 us,  4.4 sy,  0.0 ni, 86.2 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu3  :  6.7 us,  5.7 sy,  0.0 ni, 87.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu4  :  7.7 us,  5.7 sy,  0.0 ni, 85.7 id,  0.7 wa,  0.0 hi,  0.3 si,  0.0 st
    %Cpu5  :  6.8 us,  4.1 sy,  0.0 ni, 88.9 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  7987028 total,   169592 free,  5788032 used,  2029404 buff/cache
    KiB Swap:  8207356 total,  5390588 free,  2816768 used.   547764 avail Mem
    
  2. 查看/proc/cupinfo 文件

    grep ^processor /proc/cupinfo | wc -l

注:
000001 表示启用第一个CPU内核 000010表示启用第二个CPU内核,依次类推;
有多少个核,就有几位数,1表示内核开启,0表示内核关闭

Nginx 最大打开文件数

worker_rlimit_nofile 65535;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以这里与 ulimit -n 的值保持一致。

注:文件资源限制的配置可以在 /etc/security/limits.conf 文件里面设置,针对 root/user 等各个用户或者\代表所有用户来设置。*

Nginx事件处理模型

    events {
        use epoll;
        worker_connections 65535;
        multi_accept on;
    }

nginx 采用 epoll事件模型,处理效率高。

work_connections 是单个 worker 进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是woker 进程数乘以work_connections.

multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的链接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker 按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。所以当服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。

开启高效传输模式

    http{
        include mime.types;
        default_type application/octet-stream;
        ......

        sendfile on;
        tcp_nopush on;
        ......   
    }

连接超时时间

主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。

    keepalive_timeout 60;
    tcp_nodelay on;
    client_header_buffer_size 4K;
    open_file_cache max=102400 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;
    client_header_timeout 15;
    client_body_timeout 15;
    reset_timeout_connection on;
    send_timeout 15;
    server_tokens off;
    client_max_body_size 10m;

fastcgi调优

    fastcgi_connect_timeout 600;
    fastcgi_send_timeout 600;
    fastcgi_read_timeout 600;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_temp_path /usr/local/nginx1.12/nginx_tmp;
    fastcgi_intercept_errors on;
    fastcgi_cache_path /usr/local/nginx1.12/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128 min active=1d max_size=10g;
    fastcgi_cache cache_fastcgi;
    fastcgi_cache_valid 200 302 1h;
    fastcgi_cache_valid 301 1d;
    fastcgi_cache_valid any 1m;
    fastcgi_cache_min_uses 1;
    fastcgi_cache_key http://$host$request_uri;
    fastcgi_pass 127.0.0.1:9000;

nginx的缓存功能有:proxy_cache/fastcgi_cache

gzip 调优

使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。

Nginx启用压缩功能需要 ngx_http_gzip_module 模块,apache 使用的是 mod_deflate 。

一般我们需要压缩的内容有:文本,JS,HTML,CSS,对于图片、视频、flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!

    gzip on;
    gzip_min_length 2k;
    gzip_buffers 4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/javascript 
    gzip_vary on;
    gzip_proxied any;

exprires 缓存调优

缓存,主要针对于图片、css、js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css、js、html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次就非常快了。缓存的时候,我们需要将需要缓存的拓展名列出来,Expires缓存的配置在server字段里面。

    location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
        expires 30d;
        access_log off;
    }

    location ~* \.(js|css)$ {
        expires 7d;
        log_not_found off;
        access_log off;
    }

注:log_not_found off; 是否在error_log中记录不存在的错误,默认是on

防盗链

防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法有几种:

  1. 水印,品牌宣传,前提是你的带宽、服务器足够;
  2. 防火墙,直接控制,前提是你知道IP来源;
  3. 防盗链策略,下面的方法是直接给予404的错误提示。
     location ~* ^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
         valid_referers none blocked www.dncry.com dncry.com;
         if ($invalid_referer) {
             # return 302 http://www.dncry.com/images/nolink.jpg;
             return 404;
             break;
         }
         access_log off;
     }
    

内核参数优化

优化实例参考

    fs.file-max = 999999
    net.ipv4.tcp_mac_tw_buckets = 65535
    net.ipv4.ip_local_port_range = 1024 65000
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_keepalive_time = 30
    net.ipv4.tcp_syncookies = 1
    net.core.somaxconn = 262144
    net.core.netdev_max_backlog = 262144
    net.ipv4.tcp_max_syn_backlog = 262144
    net.ipv4.tcp_rmem = 10240 87380 12582912
    net.ipv4.tcp_wmem = 10240 87380 12582912
    net.core.rmem_default = 6291456
    net.core.wmem_default=6291456
    net.core.rmem_max = 12582912
    net.core.wmem_max = 12582912
    net.ipv4.tcp_max_orphans = 262144
    net.ipv4.tcp_synack_retries = 1
    net.ipv4.tcp_syn_retries = 1
    net.ipv4.tcp_fin_timeout = 1

系统连接数优化

linux默认值 open files 为 1024.
查看当前系统值:
$ ulimit -n // 1024

说明server只允许同时打开1024个文件,当作为负载较大的服务器时,很容易遇到error:too many open files.

/etc/security/limits.conf

soft nofile 65535
hard nofile 65535
soft noproc 65535
hard noproc 65535