Nginx - 参数调优完整实践
2020年03月06日 14:03:31 [原创]
目录
1. Nginx运行工作进程数量
Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l
events {
use epoll; #采用epoll事件模型,处理效率高
worker_connections 5024; #单个worker进程允许客户端最大连接数
worker_cpu_affinity 1 2 4 8; #可以减少 worker之间在不同 CPU 核心之间频繁切换的次数
multi_accept on; #on时Nginx服务器的每个工作进程一次处理完accept的所有请求,再高并发场景下显著提升处理请求的速度,但在低并发场景反倒会增加额外开销
}
http {
access_log off; #关闭访问日志,只保留错误日志即可
sendfile on; #零拷贝传输,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
tcp_nopush on; #必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数
tcp_nodelay on; #把小包组成成大包,提高带宽利用率也就是著名的nagle算法。会增加小包的数量,但是可以提高响应速度,在及时性高的通信场景中应该会有不错的效果
keepalive_timeout 65;
gzip on; #开启压缩
ssl_session_cache shared:SSL:50m; #针对https优化,对于同一客户端连接,缓存ssl握手结果避免多次握手
ssl_stapling on; #针对https优化,开启服务端ocsp缓存,避免客户端再次访问证书地址验证吊销状态,增加客户端的延迟
ssl_stapling_verify on; #针对https优化,服务端获取ocsp缓存时强制验证其合法性,可以防止中间人攻击防止ocsp响应被伪造,极大提升安全性
server {
listen 80 reuseport backlog=1024; #每个worker拥有独立的监听套接字,提升处理速度,避免全局共享监听套接字的竞争
listen [::]:80 reuseport backlog=1024;
...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
2. Nginx运行CPU亲和力
比如4核配置:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
比如8核配置:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
3. Nginx最大打开文件数
worker_rlimit_nofile 65535;
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
注:文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。
* soft nofile 65535
* hard nofile 65535
用户重新登录生效(ulimit -n)
4. Nginx事件处理模型
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
.nginx采用epoll事件模型,处理效率高。
work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections。
实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
5. 开启高效传输模式
http {
include mime.types;
default_type application/octet-stream;
……
sendfile on;
tcp_nopush on;
……
}
- Include mime.types : 媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令。
- default_type application/octet-stream :默认媒体类型足够。
- sendfile on:开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
- tcp_nopush on:必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数
6. 异步日志记录
使用 access_log 的异步写入选项,如 async 或 buffer,以减少对主线程的影响,提高性能
access_log /var/log/nginx/access.log async; #异步写入日志
access_log /var/log/nginx/access.log main buffer=1280k gzip flush=1m; #日志写入内存缓冲区,当缓存达到1280k或者日志刷新时间为1m时将写入日志文件中
7. 缓存高频操作文件的FD
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
8. 为打开文件指定缓存
open_file_cache相关
open_file_cache max=1000 inactive=10s; # 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s; # 这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 2; # open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的
open_file_cache_errors on;
文件描述信息,大小,更新时间等信息可以保存在cache中。
9. 编译优化
精简模块:Nginx由于不断添加新的功能,附带的模块也越来越多,建议一般常用的服务器软件使用源码编译安装管理;
(1) 减小Nginx编译后的文件大小
编译Nginx时默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后一个Nginx要有好几兆字节;因此可以在编译之前,修改相关源码,取消debug模式;
# 找到源码目录下 auto/cc/gcc 文件 debug
CFLAGS="$CFLAGS -g" #注释掉或删掉这两行,即可取消debug模式。
ls -alh /usr/local/nginx/sbin/nginx
-rwxr-xr-x. 1 root root 915K Aug 17 09:49 /usr/local/nginx/sbin/nginx #可以看到体积大大减少
(2) 指定GCC编译参数修改GCC编译参数提高编译优化级别稳妥起见采用 -O2 这也是大多数软件编译推荐的优化级别。
Nginx源码文件 auto/cc/gcc 搜索 NGX_GCC_OPT默认GCC编译参数为-O,可以直接修改内容为 NGX_GCC_OPT="-O2" 或者在 ./configure配置时添加--with-cc-opt='-O2'选项。