一、问题

websocket 服务使用 Nginx 反向代理后,发现会自动断开,查看日志如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2024-02-22 18:51:05:964 1901020240223104709130 [ERROR] websocket连接错误,
java.io.EOFException: null
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1339)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1226)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:75)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:183)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:162)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:157)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:842)

二、原因

使用了 Nginx 反向代理后,超过60秒没有数据传输的连接会自动断开。

三、解决方法

1. 修改 nginx 配置

1
proxy_read_timeout 3600;

将超时时间改长一点

2. 前端或者后端加个定时任务发个心跳包就好了,例如:

1
2
3
4
5
6
7
8
//定时任务,由于使用nginx反向代理,60秒无数据传输会断开
timer=setInterval(function() {
if (websocket.readyState == 1) {
websocket.send("心跳包检测");
} else {
//IM连接已断开
}
}, 50 * 1000);

我两种方法都用了,
首先将超时时间改成了一小时。
然后让前端没半小时给后台发送一次心跳,后台响应心跳。
本地图片