高并发场景下的Nginx优化指南

写在前面最近在进行服务器的优化,正好在看Nginx相关的知识,所以把一些知识整理一下 。参考资料为《Nginx高性能web服务器详解》,建议大家都去读读这本书 。
我的机器为四核CPU,16G内存 。
内核参数优化把如下的参数追加到linux系统的/etc/sysctl.conf文件中,然后使用如下命令使修改生效:/sbin/sysctl -p
net.core.netdev_max_backlog = 262144net.core.somaxconn = 262144net.ipv4.tcp_max_orphans = 262144net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_syn_retries = 1net.core.netdev_max_backlog参数
参数net.core.netdev_max_backlog,表示当每个网络接口接受数据包的速率比内核处理这些包的速率快时,允许发送队列的数据包的最大数目,我们调整为262144.
net.core.somaxconn
该参数用于调节系统同时发起的TCP连接数,一般默认值为128,在客户端高并发的请求的情况下,该默认值较小,可能导致连接超时或者重传问题,我们可以根据实际情况结合并发数来调节此值 。
net.ipv4.tcp_max_orphans
该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,没有与用户文件句柄关联到TCP套接字将立即被复位,同时发出警告信息,这个限制只是为了简单防治Dos攻击,一般系统内存充足的情况下,可以增大这个参数 。
net.ipv4.tcp_max_syn_backlog
该参数用于记录尚未收到客户端确认信息的连接请求的最大值,对于拥有128内存的系统而言,此参数的默认值为1024,对小内存的系统则是128,一般在系统内存比较充足的情况下,可以增大这个参数的赋值 。
net.ipv4.tcp_timestamps
该参数用于设置时间戳,这个可以避免序列号的卷绕,在一个1Gb/s的链路上,遇到以前用过的序列号概率很大,当此值赋值为0时,警用对于TCP时间戳的支持,默认情况下,TCP协议会让内核接受这种异常的数据包,针对Nginx服务器来说,建议将其关闭 。
net.ipv4.tcp_synack_retries
该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量,为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,这个参数主要影响这个过程,一般赋予值为1,即内核放弃连接之前发送一次SYN+ACK包 。
net.ipv4.tcp_syn_retries
该参数的作用与上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量,赋值为1 。
nginx优化nginx的配置文件如下:
user www-data;pid /run/nginx.pid;worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;worker_rlimit_nofile 65535;events { use epoll; worker_connections 65535; accept_mutex off; multi_accept off;}http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60 50; send_timeout 10s; types_hash_max_size 2048; client_header_buffer_size 4k; client_max_body_size 8m; include /etc/nginx/mime.types; default_type Application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; gzip_min_length 1024; gzip_vary on; gzip_comp_level 2; gzip_buffers 32 4k; gunzip_static on; gzip_types text/plain text/css application/json application/x-JAVAscript text/xml application/xml application/xml+rss text/JavaScript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;}worker_processes
worker_processes用来设置Nginx服务的进程数 。推荐是CPU内核数或者内核数的倍数,推荐使用CPU内核数,因为我的CPU为4核的,所以设置为4 。
worker_cpu_affinity
默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均,因此绑定Nginx进程到不同的CPU上是为了充分利用硬件的多CPU多核资源的目的 。
worker_cpu_affinity用来为每个进程分配CPU的工作内核,参数有多个二进制值表示,每一组代表一个进程,每组中的每一位代表该进程使用CPU的情况,1代表使用,0代表不使用 。所以我们使用worker_cpu_affinity 0001 0010 0100 1000;来让进程分别绑定不同的核上 。
worker_connections
设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值 。还有个问题,linux系统中有个指令open file resource limit,它设置了进程可以打开的文件句柄数量,可以用下面的指令查看你的linux系统中open file resource limit指令的值,cat /proc/sys/fs/file-max
可以将该指令设置为23900251
echo "2390251" > /proc/sys/fs/file-max; sysctl -p


推荐阅读