心跳上的HAProxy + Socket.IO + TornadIO常量断开连接

时间:2011-03-09 05:18:54

标签: nginx websocket socket.io haproxy

因此,我在使用HAProxy在端口8888上负载均衡socket.io时遇到问题。我的设置是NGINX侦听端口80,并在端口80上运行的Tornado Web服务器实例之间进行负载平衡。然后,在同一负载均衡器上,我有一个HAProxy实例侦听端口8888,将请求转发到托管TornadIO的网络中的OTHER计算机服务器实例也在8888上运行。连接在前30秒左右工作,然后开始重复断开/重新连接。重要的是要注意到它似乎在第一次心跳尝试时中断了...心跳是一个不同的协议,HAProxy会遇到麻烦而不是第一次连接尝试/最初几次消息交换?

有趣的是,当tornadIO实例与负载均衡器在同一台计算机上运行时,即使HAProxy正常工作(但连接端口8888,让端口9000上的tornadIO实例),也不会发生这种情况。

重要的是要注意TornadIO在整个过程中不会抛出任何异常或任何沮丧的输出,表明它不是我的服务器代码而是代理层中的某些东西?

让我们知道我正在使用RabbitMQ来同步所有TonadIO集群,而不是我认为它很重要(而且HAProxy不会触及Rabbit)

这是我的HAProxy设置:

global
    daemon
    maxconn 256

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

listen http-in
    balance roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    bind *:8888
    server server1 18.181.3.164:8888 # ether1

在我的nginx配置中,我插入了:

location ~* \.(eot|ttf|woff)$ {
            add_header Access-Control-Allow-Origin *;
        }

确保它不是访问控制问题(控制台不说它,所以它不应该)。

我也尝试过添加

option http-server-close
option http-pretend-keepalive

到我的HAProxy配置,但无济于事。

有什么想法吗?

**我在Chrome 9.0.597和Firefox 3.6中测试(所以使用两个网络套接字,没有,同样的事情)

1 个答案:

答案 0 :(得分:2)

我不知道这个设置中涉及的其他组件,但是上次我检查(几个月前),nginx还不支持WebSocket使用的Upgrade + 101 HTTP机制。那么也许你的测试工作直到连接升级?你肯定应该启用haproxy的登录,你知道连接关闭的地方和原因。顺便说一下,升级到1.4.13将解决一些日志问题,这些问题将帮助您更加确定地进行故障排除。