Nginx下Socket.IO WebSocket连接30秒超时问题求助
解决Nginx强制断开Socket.IO WebSocket连接的问题
我之前帮不少朋友排查过类似的问题,Nginx默认的超时配置很容易打断长连接,哪怕你一直在传输数据。结合你给出的配置片段,核心问题应该出在stream模块的超时设置或者WebSocket代理的关键头配置缺失上,下面给你一步步的解决方案:
一、针对Stream反向代理的配置调整
从你给出的stream块配置来看,你是用Nginx的TCP层代理来转发请求的,这时候需要在stream的server块里添加两个关键参数:
stream { upstream cluster { least_conn; server xx.xxx.xxx.xx:21xx; # 替换成你的Node服务地址和端口 } server { listen 80; # 你实际监听的端口 proxy_pass cluster; # 核心设置1:调长代理超时时间,避免30秒被强制断开 proxy_timeout 300s; # 核心设置2:开启TCP保活,维持长连接的活跃状态 proxy_socket_keepalive on; } }
proxy_timeout:默认情况下有些环境的这个值可能被设为30秒,直接调长到5分钟(300s)或者更符合你业务需求的时长就行。proxy_socket_keepalive on:开启TCP层面的保活机制,让Nginx和后端Node服务之间的连接不会被中间网络设备或Nginx本身轻易断开。
二、如果是HTTP层代理WebSocket的情况
要是你的Socket.IO是通过HTTP协议升级到WebSocket的(比如用Nginx的http模块代理),那除了超时设置,还必须配置WebSocket的升级头,否则Nginx无法正确识别WebSocket连接:
http { # 其他全局配置... server { listen 80; server_name your-domain.com; # 替换成你的域名 location /socket.io { proxy_pass http://xx.xxx.xxx.xx:21xx; # 你的Node服务地址 # 必须配置的WebSocket升级头 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 调长超时时间 proxy_read_timeout 300s; proxy_send_timeout 300s; # 启用HTTP/1.1,适配WebSocket的长连接特性 proxy_http_version 1.1; # 常规的转发头,可选但建议配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
三、配合Socket.IO的客户端/服务端配置优化
另外,建议检查下Socket.IO的ping/pong间隔设置,确保它能在Nginx超时前发送心跳包,重置超时计时器:
// Node.js服务端的Socket.IO配置 const io = require('socket.io')(server, { pingInterval: 25000, // 每25秒发送一次ping心跳 pingTimeout: 60000, // 60秒没收到pong就判定连接断开 });
Socket.IO默认的ping间隔是25秒,比Nginx的30秒超时短,理论上能重置超时,但如果Nginx的超时设置太严格,还是会出问题,所以配合上面的Nginx配置调整就万无一失了。
内容的提问来源于stack exchange,提问作者Ümit Aparı
相关产品推荐
相关产品推荐

