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'选项。