【巨坑】记一次nginx 配置 WebSocket 坑

项目中使用了websocket。 走了nginx 代理。

按照官网配置后,测试时发现后端能正常接收到请求,但是瞬间链接就断了。

报错信息为如下:

java.io.EOFException: null
        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:1594)
        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)

在查看ng日志的时候发现 是正常的 101  状态码! 

但是客户端接收到的状态码却是200!!!!

我的ng 配置 

 location /ws/asset/ {
                proxy_pass http://172.16.0.15:9003/ws/asset/;
                #避免nginx超时
                proxy_read_timeout 86400;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                # WebSocket support
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
 }

百思不得姐。。。。。。。

各种尝试后......

因为当前的nginx 配置文件干扰项比较多, 考虑重新搭建一个纯净的nginx, 看是否可行!

重新在干净的nginx配置后,运行程序可行!!!

基本可以锁定是 有其他配置项干扰了!

一个一个加回去测试! 

发现下面的“罪魁祸首”!


   ssi on;
   ssi_silent_errors on;
   ssi_types *;

要被自己坑死了!!!!

贴一段官网ssi的描述:

The ngx_http_ssi_module module is a filter that processes SSI (Server Side Includes) commands in responses passing through it.

ngx_http_ssi_module模块是一个过滤器,他可以处理通过它的响应中的SSI(服务器端包含)命令。

这样差不多可以解释的通为啥客户端看到的是200了。  在nginx 代理到/ws这请求后,将http 协议正常升级到 ws 协议转给后端后,后端收到请求后与服务器端建立了连接管道。但是在返回客户端时,响应被ssi 拦截了。 然后被ssi模块解析了,并返回200给了客户端。 当客户端收到200请求后,以为一次握手结束了, 链接就断了。 倒是后端打开的管道报错。以为后端还在监听,试图读取数据,但是客户端链接已经关闭了。

综上!!!

参考:

https://www.nginx.com/blog/websocket-nginx/

https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值