HAProxy + Socket.IO + TornadIO Постоянный разрыв соединения при пульсе - PullRequest
2 голосов
/ 09 марта 2011

Итак, у меня возникли проблемы с балансировкой нагрузки socket.io на порту 8888 с использованием HAProxy. Моя настройка - прослушивание NGINX на порту 80 и балансировка нагрузки между экземплярами веб-сервера Tornado, работающими на порту 80. Затем на том же распределителе нагрузки у меня есть экземпляр 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 (то же самое с обоими веб-сокетами и без них)

1 Ответ

2 голосов
/ 14 марта 2011

Я не знаю, для других компонентов, участвующих в этой настройке, но в прошлый раз, когда я проверял (несколько месяцев назад), nginx еще не поддерживал механизм HTTP Upgrade + 101, который используется WebSocket. Так может ваш тест работает до тех пор, пока не будет обновлено соединение? Вы обязательно должны включить вход на haproxy, вы бы знали, где закрыты соединения и почему. Кстати, обновление до 1.4.13 решит несколько проблем с журналированием, которые помогут вам с большей уверенностью устранить неполадки.

...