Nginx调优
目的
通过调优Nginx的配置文件,可以有效地提高Nginx服务的性能。
方法
- 根据测试的业务核数,修改nginx.conf中的worker_processes和worker_cpu_affinity配置。
配置说明如表1所示。
调优原则:以压满业务核为前提,用尽量少的中断核,配合配置网卡中断绑核中的中断脚本使用。

- 将Nginx的master进程绑定在core上。
1taskset -c N /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- N为使用的核的编号,例如0-2,表示使用core0到core2。
- 绑定策略:跟自己的业务core绑在同一个node或者CPU上。
- 配置reuseport防止socket瓶颈。
- 在配置server的时候,增加reuseport配置,调用内核的SO_REUSEPORT特性,建立足够数量的socket,避免由于socket不够导致资源争抢,如下述标粗信息所示。
1 2 3 4
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所示。
|
配置模块 |
参数 |
说明 |
|---|---|---|
|
配置全局 |
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 |
|
|
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根目录。 #定义首页索引文件的名称及顺序。 |