清除nginx连接数TIME_WAIT
系统环境:操作系统:centos7nginx版本:1.12事件起因:由于环境是部署在阿里云上的,有添加云监控报警,最近一直在报警:提示nginx的tcp连接数已经超出设置范围,然后实际上没有很多的连接,于是开启了排查解决之旅。排查工作:本机的nginx环境是用来做代理和负载的。1、想起nginx有个长连接的配置参数,是不是配置时间太长导致连接没有释放导致的呢?结果发现,最大连接数设置了10240,
系统环境:
操作系统:centos7
nginx版本:1.12
事件起因:
由于环境是部署在阿里云上的,有添加云监控报警,最近一直在报警:提示nginx的tcp连接数已经超出设置范围,然后实际上没有很多的连接,于是开启了排查解决之旅。
排查工作:
本机的nginx环境是用来做代理和负载的。
1、想起nginx有个长连接的配置参数,是不是配置时间太长导致连接没有释放导致的呢?
结果发现,最大连接数设置了10240,超时时间为65s,感觉没什么问题呀。
2、查看nginx的连接数,看看是如何导致的。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
结果发现TIME_WAIT的数量很大,想办法清理一下,网上找找解决办法吧。
网上千篇一律的教程:
网上找了一圈,发现大多数都是一个办法,就是下面这个:
说是nginx在跟后端服务器的连接方式一般都是HTTP1.0,但是HTTP1.0不支持HTTP keepalive,HTTP1.1支持,所以需要在nginx配置文件中指定成HTTP1.1,然后keepalive的时长才会生效,那就试一下吧。
http{
upstream www{
keepalive 65; # 必须配置,建议50-100之间
}
server {
location / {
proxy_pass http://www
proxy_http_version 1.1; # 后端配置支持HTTP1.1,必须配
proxy_set_header Connection ; # 后端配置支持HTTP1.1 ,必须配置。
}
}
}
修改完配置文件之后,由于不能重启线上的nginx环境,只能先加载下配置文件试一下
/usr/local/nginx/sbin/nginx -t #测试配置文件是否存在问题
/usr/local/nginx/sbin/nginx -s reload #加载nginx的配置文件
上面一顿操作下来,满心欢喜的去查看连接数,结果丝毫没有变化,可能这个方法不适合我的环境吧。没有办法,只能继续探索,下面就是我的实际解决办法。
实际解决办法:
修改linux的内核参数,增加下面的配置参数。
vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN×××,默认为0,表示关闭 net.ipv4.tcp_tw_reuse=1 #让TIME_WAIT状态可以重用,这样即使TIME_WAIT占满了所有端口,也不会拒绝新的请求造成障碍 默认是0 net.ipv4.tcp_tw_recycle=1 #让TIME_WAIT尽快回收 默认0 net.ipv4.tcp_fin_timeout=65 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
sysctl -p #加载内核文件,快速生效。
然后满心欢喜的查看阿里云上的监控,跟过山车一样就下来了。
注:
以上为本人实际搭建过程中的经验总结,如果有什么问题,可以在评论区留言,大家一起探讨进步!
更多推荐
所有评论(0)