详解nginx高并发场景下的优化

2019-10-17 17:25:07王振洲

1)同时处理的并发请求数,即它将开启最多60个子线程来处理并发连接。

<value name="max_children">60</value>

2)最多打开文件数。

<value name="rlimit_files">65535</value>

3)每个进程在重置之前能够执行的最多请求数。

<value name="max_requests">65535</value>

三、关于内核参数的优化,在/etc/sysctl.conf文件内

1)timewait的数量,默认是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小)

net.ipv4.tcp_max_tw_buckets = 6000

2)允许系统打开的端口范围。

net.ipv4.ip_local_port_range = 1024 65000

3)启用TIME-WAIT状态sockets快速回收功能;用于快速减少在TIME-WAIT状态TCP连接数。1表示启用;0表示关闭。但是要特别留意的是:这个选项一般不推荐启用,因为在NAT(Network Address Translation)网络下,会导致大量的TCP连接建立错误,从而引起网站访问故障。

net.ipv4.tcp_tw_recycle = 0

实际上,net.ipv4.tcp_tw_recycle功能的开启,要需要net.ipv4.tcp_timestamps(一般系统默认是开启这个功能的)这个开关开启后才有效果;

当tcp_tw_recycle 开启时(tcp_timestamps 同时开启,快速回收 socket 的效果达到),对于位于NAT设备后面的 Client来说,是一场灾难!

会导致到NAT设备后面的Client连接Server不稳定(有的 Client 能连接 server,有的 Client 不能连接 server)。
也就是说,tcp_tw_recycle这个功能,是为内部网络(网络环境自己可控 ” ——不存在NAT 的情况)设计的,对于公网环境下,不宜使用。

通常来说,回收TIME_WAIT状态的socket是因为“无法主动连接远端”,因为无可用的端口,而不应该是要回收内存(没有必要)。

即:需求是Client的需求,Server会有“端口不够用”的问题吗?

除非是前端机,需要大量的连接后端服务,也就是充当着Client的角色。

正确的解决这个总是办法应该是:

net.ipv4.ip_local_port_range = 9000 6553 #默认值范围较小
net.ipv4.tcp_max_tw_buckets = 10000 #默认值较小,还可适当调小
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_fin_timeout = 10 

4)开启重用功能,允许将TIME-WAIT状态的sockets重新用于新的TCP连接。这个功能启用是安全的,一般不要去改动!

net.ipv4.tcp_tw_reuse = 1

5)开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

net.ipv4.tcp_syncookies = 1

6)web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。