我所有的websocket连接都通过http(s)端口到达,并被代理到后端WS服务器:
[client]----[cloudflare]----[Apache 2.4 mod_proxy_wstunnel]----[websocket server]
一旦客户端连接到我的WS服务器,如果没有数据通过套接字,连接总是在100秒后被切断。
在开发环境中,使用相同的客户端,也使用mod_proxy_wstunnel
和相同的WS服务器,此限制不会发生
如果WS服务器每60秒发送一个ping,则不断开连接。
我想知道是否有人看到关于Cloudflare断开安静的WS连接的文档,以及mod_proxy
在服务器上的设置是否可能是原因。
技术支持人员通过电子邮件向我确认,Cloudflare会自动断开处于休眠状态100秒的websocket连接。
Cloudflare有100秒超时。只有Cloudflare的企业用户可以更改此设置。
所以解决方案是有一些keep-alive重新打开连接。另外,一个更好的解决方案是根本不使用CloudFlare。它将给你更多的灵活性,你不必依赖于外部第三方。
我也面临同样的问题。我将"代理"模式改为DNS,并从GoDaddy购买了自己的证书。之后就不用面对这个问题了。这里有详细的讨论:https://techxperiment.blogspot.com/2020/06/aws-ec2-tomcat-jsr-356-secure.html
我强烈建议向连接发送ping以避免断开连接。发送ping到WebSocket连接可以帮助防止断开连接。