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也恢復了正常。