Apache负载均衡器+Node.js/Socket.io后端:断开连接捕获遗留问题
Apache负载均衡 + Socket.io 踩坑:断开连接事件无法正常捕获
最近折腾Apache作为负载均衡器搭配Socket.io,踩了一堆坑,大部分问题已经解决,但现在卡在客户端断开连接的事件捕获上了,先跟大伙唠唠我的配置和具体问题:
我的Apache负载均衡配置
<VirtualHost *:80> ServerAdmin webmaster@example.com ServerName jpl.example.com ProxyRequests Off # 后端节点集群配置 <Proxy "balancer://jplcluster"> BalancerMember "http://127.0.0.1:3000" route=node1 BalancerMember "http://127.0.0.1:3001" route=node2 ProxySet stickysession=ROUTEID </Proxy> # Socket.io 路径代理 ProxyPass "/socket.io/" "balancer://jplcluster/socket.io/" ProxyPassReverse "/socket.io/" "balancer://jplcluster/socket.io/" # 常规HTTP请求代理 ProxyPass "/" "balancer://jplcluster/" ProxyPassReverse "/" "balancer://jplcluster/" # WebSocket支持相关配置 ProxyVia On ProxyTimeout 300 AllowEncodedSlashes NoDecode # 日志记录 ErrorLog ${APACHE_LOG_DIR}/jpl-error.log CustomLog ${APACHE_LOG_DIR}/jpl-access.log combined </VirtualHost>
已解决的问题
- 一开始会话不粘滞,同一个客户端请求跳不同节点导致Socket.io连接失败,靠
stickysession=ROUTEID搞定了 - 之前Proxy超时太短导致连接频繁断开,调了
ProxyTimeout 300后正常了 - 路径编码问题导致Socket.io握手失败,开启
AllowEncodedSlashes NoDecode解决
当前卡壳的问题(更新)
现在最头疼的是客户端断开连接时,后端Socket.io服务无法及时捕获disconnect事件:
- 客户端主动关页面/断网后,后端要等超久才触发
disconnect(远超过我设置的Socket.io超时) - 偶尔甚至完全捕获不到,导致后端的连接资源一直占着不释放
我试过的排查方法
- 调整了Socket.io的
pingTimeout(60s)和pingInterval(25s),没用 - 加了Upgrade和Connection头的转发配置:
RequestHeader set Upgrade %{HTTP:Upgrade}e env=HTTP_UPGRADE RequestHeader set Connection "upgrade" env=HTTP_UPGRADE
还是没解决问题
有没有大佬遇到过类似情况?或者能从Apache配置、Socket.io和负载均衡的协同逻辑上给点排查方向?
内容的提问来源于stack exchange,提问作者kojow7
相关产品推荐
相关产品推荐

