websocket 服务使用 Nginx 反向代理后,发现会自动断开,查看日志如下
2021-04-30 10:34:02.404 ERROR 153322 --- [nio-8088-exec-7] com.yxc.imapi.core.WebSocketServer : 发生错误:null,Session ID: 1e
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1231)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1141)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
原因:使用了 Nginx 反向代理后,超过60S没有数据传输的连接会自动断开。
解决方法有两个:
1、修改nginx配置
proxy_read_timeout 默认 60s 断开,修改即可,比如 60 分钟
proxy_read_timeout 3600s;
2、前端或者后端加个定时任务发个心跳包就好了,例如:
//定时任务,由于使用nginx反向代理,60秒无数据传输会断开
timer=setInterval(function() {
if (websocket.readyState == 1) {
websocket.send("心跳包检测");
} else {
//IM连接已断开
}
}, 50 * 1000);