鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

Nginx调优

目的

通过调优Nginx的配置文件,可以有效的提高Nginx服务的性能。

方法

  1. 根据测试的业务核数,修改nginx.conf中的worker_processes和worker_cpu_affinity配置。

    配置说明如表1所示。

    调优原则:以压满业务核为前提,用尽量少的中断核,配合配置网卡中断绑核中的中断脚本使用。

  2. 将Nginx的master进程绑定在core上。
    1
    taskset -c N /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    
    • N为使用的核的编号,例如0-2,表示使用core0到core2。
    • 绑定策略:跟自己的业务core绑在同一个node或者CPU上。
  3. 配置reuseport防止socket瓶颈。
  4. 在配置server的时候,增加reuseport配置,调用内核的SO_USEPORT特性,建立足够数量的socket,避免由于socket不够导致资源争抢。
    1
    server {          listen       10000 reuseport;          server_name  localhost;
    

Nginx.conf配置文件示例

本节以负载均衡场景下,HTTP短连接场景的4core用例的nginx.conf为例:

user  root; 
worker_processes 2; 
worker_cpu_affinity 
1 
10; 
error_log /dev/null; 
worker_rlimit_nofile 102400; 
events { 
    worker_connections  102400; 
    multi_accept on; 
    use epoll; 
    accept_mutex off; 
} 
http { 
    include       mime.types; 
    default_type  application/octet-stream; 
    access_log /dev/null; 
    sendfile        on; 
    tcp_nopush     on; 
    tcp_nodelay     on; 
    sendfile_max_chunk 512k; 
    keepalive_timeout  65; 
    keepalive_requests 2000; 
    client_header_buffer_size 4k; 
    large_client_header_buffers 4 32k; 
    server_names_hash_bucket_size 128; 
    client_max_body_size 100m; 
    open_file_cache max=102400 inactive=40s; 
    open_file_cache_valid 50s; 
    open_file_cache_min_uses 1; 
    open_file_cache_errors on; 
   upstream test{ 
       server 192.168.1.75:10000  ; 
       server 192.168.2.75:11000  ; 
       server 192.168.1.72:10000 ; 
       server 192.168.2.72:11000 ; 
       keepalive 300; 
        } 
   server { 
        listen       10000 reuseport; 
        server_name  localhost; 
        access_log off; 
        location / { 
            root   html; 
            index  index.html index.htm; 
                   proxy_pass http://test; 
                proxy_connect_timeout 75; 
                proxy_read_timeout 300; 
                proxy_send_timeout 300; 
                proxy_buffer_size 4k; 
                proxy_buffers   4 32k; 
                proxy_busy_buffers_size 64k; 
                proxy_temp_file_write_size 64k; 
                proxy_http_version 1.1; 
                proxy_set_header Connection ""; 
                proxy_headers_hash_max_size 51200; 
                proxy_headers_hash_bucket_size 6400; 
        } 
        error_page   500 502 503 504  /50x.html; 
        location = /50x.html { 
            root   html; 
        } 
    } 
    # HTTPS server 
        server { 
         listen       20000 ssl ; 
         server_name  localhost; 
         ssl_certificate      /usr/local/nginx/server_2048.crt; 
         ssl_certificate_key  /usr/local/nginx/server_2048.key; 
         ssl_session_cache    shared:SSL:1m; 
         ssl_session_timeout  5m; 
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; 
        ssl_ciphers  "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; 
         ssl_prefer_server_ciphers  on; 
         location / { 
             root   html; 
             index  index.html index.htm; 
         } 
     } 
}

Nginx的配置是区块型的,包括全局配合(如user、worker_processes等)和模块配置(其中events为events模块,http为http模块),每个模块配置中又分为各个区块,如http模块中有server区块,server有location区块。

Nginx基本配置与参数说明如表1所示。

表1 Nginx基本配置与参数说明

配置模块

参数

说明

配置全局

user root;

定义Nginx运行的用户和用户组。

worker_processes 3;

Nginx进程数,建议设置为等于CPU总核心数。

worker_cpu_affinity

1

10

100;

通过worker_cpu_affinity给每个worker进程绑定一个CPU, 1表示启用core0,10表示启用core1,100表示启动core2,依次类推,100000表示启用core5,1后面有n个0就表示启动core n。

error_log /dev/null;

错误日志文件路径,/dev/null表示关闭Nginx日志。

worker_rlimit_nofile 102400;

指定一个Nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量(ulimit-n)限制。

配置events模块

worker_connections 102400;

定义每个进程的最大连接数,受系统进程的最大打开文件数量限制,并发总数是worker_processes 和 worker_connections 的乘积。

multi_accept on;

设置一个进程是否同时接受多个网络连接,如果multi_accept被禁止了,Nginx一个工作进程只能同时接受一个新的连接。

use epoll;

设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式。

accept_mutex on;

打开accept_mutex,避免了worker争夺资源造成的上下文切换以及try_lock的锁开销。

配置HTTP模块

include mime.types;

文件扩展名与文件类型映射表。

default_type application/octet-stream;

默认文件类型。

access_log /dev/null;

Nginx访问日志路径,/dev/null表示关闭访问日志。

sendfile on;

开启高效文件传输模式,获取文件跨过用户态;.gzip压缩器需要在用户态进行,因此无法和sendfile共存。

tcp_nopush on;

开启防止网络阻塞,返回数据的首个数据包会携带从sendfile中获取大块的数据后才会被发送。

tcp_nodelay on;

开启防止网络阻塞。

sendfile_max_chunk 512k;

限制最大sendfile的文件大小,防止过大的文件占据整个工作进程默认为“无限制”。

keepalive_timeout 65;

设置客户端连接保存活动的超时时间。

keepalive_requests 2000;

设置一个keep-alive连接上可以服务的请求的最大数量。当最大请求数量达到时,连接被关闭。

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

large_client_header_buffers 4 32k;

设置客户端请求的Header头缓冲区大小:4为个数,32k为大小,表示申请4个32k。默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。

server_names_hash_bucket_size 128;

保存服务器名字的hash表的大小。

client_max_body_size 100m;

控制全局nginx所有请求报文大小,100M。

open_file_cache max=102400 inactive=40s;

max设置缓存中的最大元素数,在缓存溢出时,删除最近最少使用(LRU)的元素;inactive定义一个时间,如果在此期间未访问该元素,则从该缓存中删除该元素。

open_file_cache_valid 50s;

多长时间检查一次缓存的有效信息。也就是说即使我一直访问这个文件,50s后会检查此文件的更改信息是否变化,发现变化就更新。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件更改信息一直是在缓存中打开的。

open_file_cache_errors on;

启用文件查找错误的缓寸。

配置反向代理服务器组test(Nginx会根据配置,将请求分发给组里的某一台服务器。)

server 192.168.1.75:10000 ;

server 192.168.2.75:11000;

server 192.168.1.73:10000;

server 192.168.2.73:11000;

配置处理最终请求的服务器IP及端口。

keepalive 300;

设置连接超时时间。

设定主机配置

listen 10000 reuseport;

侦听10000端口,http短连接场景建议打开reuseport,长连接可复用。

server_name localhost;

定义使用localhost访问。

access_log off;

关闭本虚拟主机的访问日志。

默认请求

root html;

定义服务器的默认网站根目录位置,root是web根目录。

index index.html index.htm;

定义首页索引文件的名称及顺序。

proxy_pass http://test;

表示将所有请求转发到服务器组test配置的服务器中。

proxy_connect_timeout 75;

设置后端服务器的连接超时时间。

proxy_read_timeout 300;

设置Nginx与后端服务器建立连接后,等待后端服务器的响应时间。

proxy_send_timeout 300;

指定请求转移到后端服务器的超时时间,超时Nginx将关闭连接。

proxy_buffer_size 4k;

设置用于保存用用户的头部信息的代理缓冲区大小。

proxy_buffers 432k;

设置缓冲区的数目和大小。

proxy_busy_buffers_size 64k;

用于当系统负载较大,缓冲区不够用时,可以设置更大的proxy_buffers。

proxy_temp_file_write_size 64k;

用于指定缓存临时文件的大小。

proxy_http_version 1.1;

设置Nginx服务器提供代理服务的http协议版本1.1。

proxy_set_header Connection "";

允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。

proxy_headers_hash_max_size 51200;

存放http报文头的哈希表容量上限。

proxy_headers_hash_bucket_size 6400;

nginx服务器申请存放http报文头的哈希表容量大小。

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

定义错误提示页面。

配置SSL加密

listen 20000 ssl;

侦听20000端口。

server_name localhost;

定义使用localhost访问。

ssl_certificate /usr/local/nginx/server_2048.crt;

ssl_certificate证书是公钥,它会被发送到连接服务器的每个客户端。

ssl_certificate_key /usr/local/nginx/server_2048.key;

ssl_certificate_key 私钥 是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。

ssl_session_cache shared:SSL:1m;

设置ssl会话缓存的类型和大小,shared:SSL:1m表示我所有的nginx工作进程共享ssl会话缓存,1M可以存放约4000个sessions。

ssl_session_timeout 5m;

客户端可以重用会话缓存中ssl参数的过期时间,5分钟。

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

用于启动特定的加密协议。

ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

选择加密套件。

ssl_prefer_server_ciphers on;

设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

location / {

root html;

index index.html index.htm;

}

#默认请求。

#定义服务器的默认网站根目录位置,root是web根目录。

#定义首页索引文件的名称及顺序。