Nginx HAProxy+;Socket.IO+;心跳时TornadIO常量断开连接

Nginx HAProxy+;Socket.IO+;心跳时TornadIO常量断开连接,nginx,websocket,socket.io,haproxy,Nginx,Websocket,Socket.io,Haproxy,因此,我在端口8888上使用HAProxy进行负载平衡socket.io时遇到问题。我的设置是NGINX在端口80上侦听,并在端口80上运行的Tornado web服务器实例之间进行负载平衡。然后,在同一个负载平衡器上,我有一个HAProxy实例在端口8888上侦听,将请求转发到网络中承载同样在8888上运行的TornadIO服务器实例的其他计算机。连接在前30秒左右工作,然后开始反复断开/重新连接。需要注意的是,它似乎在第一次尝试心跳时就中断了。。。与第一次连接尝试/交换的前几条消息相比,心跳

因此,我在端口8888上使用HAProxy进行负载平衡socket.io时遇到问题。我的设置是NGINX在端口80上侦听,并在端口80上运行的Tornado web服务器实例之间进行负载平衡。然后,在同一个负载平衡器上,我有一个HAProxy实例在端口8888上侦听,将请求转发到网络中承载同样在8888上运行的TornadIO服务器实例的其他计算机。连接在前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中进行测试(因此,无论是否使用web套接字,都是一样的)

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

关键不在于@Ilya正在使用HAProxy for tornadio,以便Nginx不侦听端口8888上的连接(因为它不支持到反向代理进程的HTTP 1.1连接).这个问题有什么解决办法@Ilya?我将在不久的将来使用一个非常类似的设置。有什么建议吗?