问题

nginx使用命令netstat -an|grep TIME_WAIT|wc -l查看有很多TIME_WAIT image.png

原因分析

nginx和网关使用的tcp短连接,一个连接使用完会经历四次挥手断开,主动关闭TCP连接的一方需要等2MSL之后才会真正释放TCP连接,在2MSL之前连接的状态都是TIME_WAIT。

解决办法

让Nginx与上游网关服务器之间通过Http1.1的Keepalive协议重用TCP连接,减少TCP连接数量。

upstream gate {
    server 172.16.10.28:10009;
    
    #设置可复用的tcp连接的空闲数量的最大值,根据实际情况估算
    keepalive 50;
}

location / {
    proxy_pass http://gate;
    
    #添加http1.1协议头,这样上游网关服务就会启用keepalive,不会主动发起关闭TCP连接,网关服务器会减少TIME_WAIT数量
    proxy_http_version 1.1;
    proxy_set_header Connection "";

其他扩展

修改服务器内核参数

#开启SYNCookies。当SYN等待队列溢出时,启用cookies处理,可防范少量SYN攻击,默认0,表关闭;
net.ipv4.tcp_syncookies= 1
#开启重用。允许将TIME-WAITsockets重用于新的TCP连接,默认0,表示关闭;
net.ipv4.tcp_tw_reuse= 1
#开启TCP连接中TIME-WAITsockets的快速回收,默认0,表关闭;
net.ipv4.tcp_tw_recycle= 1