2

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

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

需要注意的是,在整个过程中 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 中进行测试(所以有两个网络套接字,没有相同的东西)

4

1 回答 1

2

我不知道此设置中涉及的其他组件,但上次我检查(几个月前),nginx 还不支持 WebSocket 使用的 Upgrade+101 HTTP 机制。那么也许您的测试在连接升级之前有效?您绝对应该在 haproxy 上启用日志记录,您会知道连接关闭的位置以及原因。顺便说一句,升级到 1.4.13 将解决一些日志记录问题,这将帮助您更确定地进行故障排除。

于 2011-03-14T06:24:57.410 回答