nginx 打不開網站

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章