清除nginx连接数TIME_WAIT

在阿里云上运行的CentOS7系统中,由于Nginx TCP连接数超出预设范围引发报警。博主通过排查发现TIME_WAIT状态的连接数量庞大。尝试修改Nginx配置以支持HTTP1.1和keepalive,但未见成效。最终,博主通过调整Linux内核参数,包括开启TCP SYNcookies、允许TIME_WAIT连接重用和加速回收,以及设置TCP FIN_TIMEOUT,成功解决了问题,使监控指标恢复正常。

系统环境:

操作系统: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]}'

  1. CLOSED:无连接是活动的或正在进行

  2. LISTEN:服务器在等待进入呼叫

  3. SYN_RECV:一个连接请求已经到达,等待确认

  4. SYN_SENT:应用已经开始,打开一个连接

  5. ESTABLISHED:正常数据传输状态

  6. FIN_WAIT1:应用说它已经完成

  7. FIN_WAIT2:另一边已同意释放

  8. ITMED_WAIT:等待所有分组死掉

  9. CLOSING:两边同时尝试关闭

  10. TIME_WAIT:另一边已初始化一个释放

  11. LAST_ACK:等待所有分组死掉

 结果发现TIME_WAIT的数量很大,想办法清理一下,网上找找解决办法吧。

网上千篇一律的教程:

网上找了一圈,发现大多数都是一个办法,就是下面这个:

说是nginx在跟后端服务器的连接方式一般都是HTTP1.0,但是HTTP1.0不支持HTTP keepalive,HTTP1.1支持,所以需要在nginx配置文件中指定成HTTP1.1,然后keepalive的时长才会生效,那就试一下吧。

  1. http{

  2. upstream www{

  3. keepalive 65;                                                     # 必须配置,建议50-100之间

  4. }

  5. server {

  6. location / {

  7. proxy_pass http://www

  8. proxy_http_version 1.1;                                   # 后端配置支持HTTP1.1,必须配

  9. proxy_set_header Connection ;                   # 后端配置支持HTTP1.1 ,必须配置。

  10. }

  11. }

  12. }

 修改完配置文件之后,由于不能重启线上的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                        #加载内核文件,快速生效。

 然后满心欢喜的查看阿里云上的监控,跟过山车一样就下来了。

注: 

以上为本人实际搭建过程中的经验总结,如果有什么问题,可以在评论区留言,大家一起探讨进步!

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值