优化 Nginx worker 进程数
Nginx 有 master 和 worker 两种进程,master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务。
worker 进程数默认为 1 。
worker_processes 1;
worker 进程数应该设置为服务器 CPU 的核数。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核数
2
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf # 设置worker进程数
worker_processes 2;
worker_processes 这个参数最好是设置成 auto 自动匹配进程数。
绑定 Nginx 进程到不同的 CPU 上
默认情况下,Nginx 的多个进程有可能跑在某一个 CPU 或 CPU 的某一核上,导致 Nginx 进程使用硬件的资源不均,因此绑定 Nginx 进程到不同的 CPU 上是为了充分利用硬件的多 CPU 多核资源。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核数
2
worker_processes 2; # 2核CPU的配置
worker_cpu_affinity 01 10;
worker_processes 4; # 4核CPU的配置
worker_cpu_affinity 0001 0010 0100 1000;
worker_processes 8; # 8核CPU的配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
优化 Nginx 单个进程允许的最大连接数
控制 Nginx 单个进程允许的最大连接数的参数为 worker_connections ,这个参数要根据服务器性能和内存使用量来调整。
进程的最大连接数受 Linux 系统进程打开的最大文件数的限制,只有执行了 “ulimit -HSn 65535” 之后,worker_connections 才能生效。
连接数包括代理服务器的连接、客户端的连接等,Nginx 总并发连接数 = worker_processes * worker_connections。总数保持在 3w 左右即可。
worker_processes 2;
worker_cpu_affinity 01 10;
user nginx nginx;
events {
use epoll;
worker_connections 15000;
}
优化 Nginx worker 进程打开的最大文件数
worker_rlimit_nofile 65535; # worker 进程打开的最大文件数,可设置为优化后的 ulimit -HSn 的结果
开启高效文件传输模式
sendfile 参数用于开启文件的高效传输模式,该参数实际上是激活了 sendfile () 功能。
sendfile () 是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的,被称为 “零拷贝” 。sendfile 比 read 和 write 函数要高效得多,因为 read 和 write 函数要把数据拷贝到应用层再进行操作。
tcp_nopush 参数用于激活 Linux 上的 TCP_CORK socket 选项,此选项仅仅当开启 sendfile 时才生效,tcp_nopush 参数可以把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量。
http {
include mime.types;
default_type application/octet-stream;
sendfile on; # 开启文件的高效传输模式
tcp_nopush on; # 激活 TCP_CORK socket 选择
tcp_nodelay on; # 数据在传输的过程中不进缓存
keepalive_timeout 65;
include vhosts/*.conf;
}
优化 Nginx 连接的超时时间
连接超时的作用
-
将无用的连接设置为尽快超时,可以保护服务器的系统资源(CPU、内存、磁盘)
-
当连接很多时,及时断掉那些建立好的但又长时间不做事的连接,以减少其占用的服务器资源
-
如果黑客攻击,会不断地和服务器建立连接,因此设置连接超时以防止大量消耗服务器的资源
-
如果用户请求了动态服务,则 Nginx 就会建立连接,请求 FastCGI 服务以及后端 MySQL 服务,设置连接超时,使得在用户容忍的时间内返回数据
连接超时存在的问题
-
服务器建立新连接是要消耗资源的,因此,连接超时时间不宜设置得太短,否则会造成并发很大,导致服务器瞬间无法响应用户的请求。
-
有些 PHP 站点会希望设置成短连接,因为 PHP 程序建立连接消耗的资源和时间相对要少些。
-
有些 Java 站点会希望设置成长连接,因为 Java 程序建立连接消耗的资源和时间要多一些,这是由语言的运行机制决定的。
设置超时时间
-
keepalive_timeout:用于设置客户端连接保持会话的超时