Веб-сокеты, ошибка em-websocket и HAProxy 502

Я пытаюсь запустить веб-сервер и сервер веб-сокетов на порту 80. Для этого я использую HAProxy для маршрутизации соединений, используя эту конфигурацию:

global
    maxconn     4096 # Total Max Connections. This is dependent on ulimit
    nbproc      1
    ulimit-n        65536

defaults
    mode      http

frontend all 0.0.0.0:80
    timeout client 86400000
    acl is_websocket hdr_beg(host) -i live
    acl is_websocket hdr(Upgrade) -i WebSocket

    default_backend www_backend

    use_backend production_socket_backend if is_websocket

backend www_backend

    balance roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout server 30000
    timeout connect 4000
    server appserver 127.0.0.1:81 weight 1 maxconn 1024

backend production_socket_backend
    balance roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    server appserver 127.0.0.1:8083 weight 1 maxconn 1024

Я тестирую с помощью Google Chrome. На некоторых машинах я подключаюсь нормально, на других выдает ошибку 502, и em-websocket регистрирует эту ошибку:

#<EventMachine::WebSocket::HandshakeError: Connection and Upgrade headers required>

Если я перестану запускать прокси и запущу сервер веб-сокетов на порту 80, он будет работать нормально, что для меня указывает на то, что проблема связана с прокси. Я где-то читал, что HAProxy не следует запускать в режиме http при работе с веб-сокетами, поскольку пакет обновления не является действительным HTTP, может ли это иметь какое-то отношение к проблемам, которые я вижу?


person Mike Neumegen    schedule 11.06.2012    source источник


Ответы (2)


Я использую порт 443 на данный момент. В будущем у меня будут веб-сокеты, работающие на отдельном сервере, чтобы обойти эту проблему.

person Mike Neumegen    schedule 02.07.2012

да, попробуйте перейти в режим tcp.

Я не уверен, работает ли пересылка материалов с проверкой заголовка. У меня есть сокеты на выделенном порту.

listen websockets
    mode tcp
    bind *:8000
    balance source
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    server thin_web1 x.x.x.x:8000

И баланс источника важен, если у вас есть несколько серверов, чтобы поддерживать соединение сокета с одним и тем же сервером.

person v1rtual    schedule 12.06.2012
comment
Спасибо @v1rtual. Я не знал об источнике баланса. К сожалению, я пытаюсь запустить как веб-сервер, так и сервер веб-сокетов на порту 80 в надежде, что веб-сокеты не будут заблокированы строгими брандмауэрами. - person Mike Neumegen; 13.06.2012
comment
хорошо, тогда вам нужно изменить интерфейс порта 80 на режим tcp, чтобы em-websocket работал. Ваши проверки hdr больше не будут работать. socket.io, похоже, работает в режиме http: /а> - person v1rtual; 19.06.2012