socket.io、netty-socketio、nginx 每分钟断开连接

Posted

技术标签:

【中文标题】socket.io、netty-socketio、nginx 每分钟断开连接【英文标题】:socket.io, netty-socketio, nginx disconnecting every minute 【发布时间】:2015-02-19 20:05:41 【问题描述】:

我有一个netty-socketio 服务器在端口9092 上运行。 nginx 配置为侦听端口 9093 并代理对 netty-socketio 服务器的请求(两者当前在同一台服务器上运行,但在生产中将分开)。

如果我直接连接到套接字服务器,一切都会按预期工作,但是当通过 nginx 连接时,连接会每隔一分钟断开并重新连接。

极其简化的客户端示例:

<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdn.socket.io/socket.io-1.3.4.js"></script>
        <script>
            var socket = io.connect('http://1.1.1.1:9093');

            socket.on('connect', function ()
            
                console.log('connected to socket server');
            );

            socket.on('disconnect', function ()
            
                console.log('lost connection to socket server');
            );
        </script>
    </head>
</html>

nginx 配置:

upstream socketserver 
    server 127.0.0.1:9092;


server 
    listen 9093;
    location / 
        proxy_pass http://socketserver;
        proxy_http_version 1.1;
        proxy_pass_header Server;
        proxy_pass_header Connection;
        proxy_pass_header Date;
    

我能找到的唯一区别是Connection: Upgrade 标头在直接连接时设置为大写“U”,而在使用nginx 时设置为全部小写(“升级”)。我尽可能从源代码重新编译nginx,但使用大写的“U”并没有什么不同。

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

尝试在上游部分添加keepalive

...
keepalive 60;

【讨论】:

谢谢,但没有任何区别。【参考方案2】:

在尝试了默认值为60s 的指令后,我发现罪魁祸首是proxy_read_timeout。在server 上下文中添加它为我解决了这个问题:

proxy_read_timeout 86400s;

有关此指令 here 的文档。

【讨论】:

以上是关于socket.io、netty-socketio、nginx 每分钟断开连接的主要内容,如果未能解决你的问题,请参考以下文章

netty-socketio堆外内存泄露排查盛宴

到 socket.io 服务器的服务器端连接

即时通讯:服务端SpringBoot+Netty-Socket.io,客户端Socket.io.js+Java版Socket.io-client

netty 堆外内存泄露排查盛宴

记一次Netty堆外内存泄露排查过程

Java 自定义事件处理程序和侦听器