Nginx
nginx檢測死客戶端
通常,當您將網路電纜從網路設備中拉出時(模擬網路上的一些中斷,因此會出現模糊的斷開連接),底層套接字不會檢測到斷開連接(至少我們的單元不會),因此我們使用 keep alive 來斷開連接並重新連接。
所有單位都使用每小時長輪詢到 nginx 伺服器。所以我的問題是:
如果該單元沒有檢測到電纜斷開連接(可能還有 100 種網路上的其他情況),那麼 nginx 也沒有斷開套接字並且該套接字保持打開狀態?
保持開放多久?
我們是否應該在 nginx 端也使用 tcp keep alive 對客戶端?如何?
您需要 TCP keepalive 才能檢測到這樣的中斷。Socket只是一個抽象,只有當連接中的數據包傳輸失敗時,socket才會關閉。
在長輪詢情況下,沒有數據包傳輸,因此 TCP 狀態機沒有封包遺失事件做出反應。
因此,您需要在網路堆棧上啟用 TCP keepalive:
sysctl -w net.ipv4.tcp_keepalive_time = 600 sysctl -w net.ipv4.tcp_keepalive_intvl = 60 sysctl -w net.ipv4.tcp_keepalive_probes = 5
第一個值指定在發送保活探測之前連接必須空閒多長時間。
第二個值指定一旦觸發發送,應多久發送一次 keepalive 探測。
最後一個值表示在連接被認為斷開之前必須失敗多少個探測數據包。
sysctl
唯一修改執行配置。您需要參考您的發行版的文件以了解如何使其持久化。