nginx 打不開網站nginx
這個問題以前歷來沒有遇到過,因此費了很大週摺才發現並搞定。web
症狀: 網站沒法訪問vim
排查過程: tcp
1 w看負載,幾乎爲0ide
2 sar/nload看流量正常網站
3 top看各項指標正常,vmstat看也正常日誌
4 tcpdump抓包,看不出異常ip
5 nginx訪問日誌很是少,幾乎不新增日誌(意味着沒有正常的訪問出現)it
6 錯誤日誌沒有class
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也恢復了正常。