haproxy и socket.io работают не полностью

Я пробовал все мыслимые конфигурации haproxy, опубликованные в блогах и stackoverflow, но я все еще не могу заставить haproxy и socket.io работать в 100% случаев. В большинстве браузеров, которые «поддерживают» веб-сокеты, он дает сбой и возвращается к длительному опросу после пропущенных сердечных сокращений. Браузер, кажется, устанавливает начальное соединение (отладка nodejs), но я не могу заставить клиентов получать ответ на соединение. У кого-нибудь еще есть подобные проблемы? Ниже приведены номера версий программного обеспечения и несколько конфигураций, которые я пробовал.

  • хапрокси 1.4.18
  • узел 0.6.5
  • сокет.ио 0.8.7

Конфигурации Haproxy (я пробовал еще много и множество вариантов):

Веб-сокеты, работающие в:

  • Сафари 5 (Windows)
  • Хром 11 (Линукс)

person user1120155    schedule 28.12.2011    source источник
comment
Я удалил haproxy из уравнения, и socket.io работает безупречно, поэтому я, должно быть, делаю что-то неправильно в моей конфигурации haproxy, иначе по какой-то причине они больше не работают вместе.   -  person user1120155    schedule 29.12.2011
comment
Если я остановлю haproxy до того, как socket.io переключит протоколы, тогда клиенту будет отправлено сообщение веб-сокета при подключении. Сейчас я использую ссылка для настройки.   -  person user1120155    schedule 30.12.2011
comment
Я потратил довольно много времени, пытаясь получить правильную конфигурацию haproxy. В моем случае я хотел, чтобы веб-сокеты и флэш-сокеты проходили, но никакие другие транспорты. Я также хотел завершить ssl на haproxy. Прошло некоторое время, и вы, вероятно, решили эту проблему. Однако я написал о своем решении в блоге: blog.carbonfive.com/2013/05/02/ С уважением, Кристиан   -  person Christian Nelson    schedule 21.05.2013


Ответы (1)


Веб-сокеты не могут быть обратными прокси-серверами, потому что 8 байтов данных, которые клиент должен отправить после заголовков, не объявляются в заголовке Content-Length, поэтому промежуточные звенья не будут пересылать эти данные до тех пор, пока не завершится рукопожатие. А поскольку для завершения рукопожатия нужны эти 8 байтов, рукопожатие никогда не завершается и блокируется, http://www.enotes.com/topic/WebSockets#Proxy_traversal. Это не единственный источник. Многие другие источники подтверждают, что они не могут быть проксированы обратным прокси.

person user1120155    schedule 29.12.2011
comment
Этот момент совершенно неверен и относится к первоначальному проекту веб-сокета, который не был совместим с HTTP. WebSocket может использоваться для обратного проксирования, поскольку он стал HTTP-совместимым. - person Willy Tarreau; 24.05.2012