NGINX + TOMCAT出现大量的TIME-WAIT状态的TCP连接解决

原创
2019/04/27 13:18
阅读数 4.9K

记录一次帮朋友排查应用变慢的问题,

访问量变大的时候,请求响应变慢,但数据库和服务器相关资源都正在,我们看看一下连接数

netstat -n|awk '/^tcp/{++S[$NF]}END{for (key in S) print key,S[key]}'

意外的发现

[root@iZ25627ehy9Z hmkx]# netstat -n|awk '/^tcp/{++S[$NF]}END{for (key in S) print key,S[key]}'
TIME_WAIT 3114
CLOSE_WAIT 2
ESTABLISHED 250

TIME_WAIT状态的连接竟然多大3000多,这时候怀疑这个造成的,所以就查了一下资料,主要原因:

1.nginx开启了keepalive ,而且默认用的http1.1

2.tomcat开启了keepalive,默认也使用http1.1

3.但是nginx代理却使用的http1.0,默认不开启keepalive,所以就造成了大量的TIME-WAID状态的TCP连接

目前有两个解决办法

方法一:nginx官网提供

For HTTP, the proxy_http_version directive should be set to “1.1” and the “Connection” header field should be cleared:
参考地址:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

upstream http_backend {
    server 127.0.0.1:8080;

    keepalive 16;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

方法二:从系统层面解决(不建议,可能采坑出现大量的close wait)

vi /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1  
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_tw_recycle = 1  
net.ipv4.tcp_fin_timeout = 30  
然后执行 /sbin/sysctl -p 让刚添加的内容生效  
   
解释下:  
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;  
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;  
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。  
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间  

理论上少量的TIME-WAIT占用资源并不多,但不要忽略它,不然流量突然来临会让你措手不及,有待确认是否这个造成,目前未出现上次的问题

 

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部