通常,当您将网络电缆从网络设备中拉出时(模拟网络上的一些中断,因此会出现模糊的断开连接),底层套接字不会检测到断开连接(至少我们的单元不会),因此我们使用 keep alive 来断开连接并重新连接。
所有单位都使用每小时长轮询到 nginx 服务器。所以我的问题是:
如果该单元没有检测到电缆断开连接(可能还有 100 种网络上的其他情况),那么 nginx 也没有断开套接字并且该套接字保持打开状态?
保持开放多久?
我们是否应该在 nginx 端也使用 tcp keep alive 对客户端?如何?
您需要 TCP keepalive 才能检测到这样的中断。Socket只是一个抽象,只有当连接中的数据包传输失败时,socket才会关闭。
在长轮询情况下,没有数据包传输,因此 TCP 状态机没有数据包丢失事件做出反应。
因此,您需要在网络堆栈上启用 TCP keepalive:
第一个值指定在发送保活探测之前连接必须空闲多长时间。
第二个值指定一旦触发发送,应多久发送一次 keepalive 探测。
最后一个值表示在连接被认为断开之前必须失败多少个探测数据包。
sysctl
唯一修改运行配置。您需要参考您的发行版的文档以了解如何使其持久化。