Nginx

nginx檢測死客戶端

  • December 23, 2020

通常,當您將網路電纜從網路設備中拉出時(模擬網路上的一些中斷,因此會出現模糊的斷開連接),底層套接字不會檢測到斷開連接(至少我們的單元不會),因此我們使用 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唯一修改執行配置。您需要參考您的發行版的文件以了解如何使其持久化。

引用自:https://serverfault.com/questions/1047288