nginx 打不开网站
这个问题之前从来没有遇到过,所以费了很大周折才发现并搞定。
症状: 网站无法访问
排查过程:
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也恢复了正常。
原文地址:http://9553933.blog.51cto.com/9543933/1882166