nginx 打不开网站 last-ack很多

回复 收藏

这个问题之前从来没有遇到过,所以费了很大周折才发现并搞定。

症状: 网站无法访问

排查过程: 

1 w看负载,几乎为0

2 sar/nload看流量正常

3 top看各项指标正常,vmstat看也正常

4 tcpdump抓包,看不出异常

5 nginx访问日志非常少,几乎不新增日志(意味着没有正常的访问出现)

6 错误日志没有

7 重启nginx异常,表现为服务杀不死,只能killall -9 nginx 杀死服务

8 ss -an 有比较多的LAST-ACK状态,这个让我开始怀疑,找了一台正常的web机器,对比看 LAST_ASK为0个,但这台机器为100多个。 所以最终开始在这个上面研究。

LASK_ACK状态的含义是, 关闭一个TCP连接需要从两个方向上分别进行关闭,双方都是通过发送FIN来表示单方向数据的关闭,当通信双方发送了最后一个FIN的时候,发送方此时处于LAST_ACK状态,当发送方收到对方的确认(Fin的Ack确认)后才真正关闭整个TCP连接应该是还在连接的!没有收到确认的信息就会这样。也可以这么说! 如果该通信是你主动去建立的!那么没问题!如果是被动的话!那么有问题了! 因为TCP/IP的建立要经过3次握手的!最后一次没有收到确认的话!就会是这种状态! 从原理上应该是这样的!

所以,这就意味着,有人恶意不确认,不关闭连接。这样导致LAST_ACK状态太多。  如果这个状态太多,肯定会影响正常的tcp连接。

接下来就是减少甚至消灭这种状态。

修改内核参数:

vim /etc/sysctl.conf 最后面加入

net.ipv4.tcp_keepalive_time = 10

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

保存后,运行 sysctl -p  再次观察LAST_ACK逐渐减少,直至为0

当然,最终web也恢复了正常。

2016-11-29 22:35 举报
已邀请:
0

scshfei

赞同来自:

学习了

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: