HAProxy + веб-сокеты + сохраняемость приложений

У меня есть сценарий, который требует, чтобы все запросы веб-сокетов из одного браузера направлялись на один и тот же сервер приложений. В настоящее время я использую HAProxy для LB. Я заметил, что он отлично работает для «обычных» HTTP-запросов, но когда я пытаюсь выполнить запрос WebSocket, липкий файл cookie не вставляется в ответ. Я еще не углубился в исходный код HAProxy, но, похоже, происходит то, что HAProxy не вставляет файлы cookie для ответов 101 Switching Protocol? Это всего лишь предположение.

Вот мои настройки: Браузер ‹ -- > Stunnel ‹ -- > HAProxy ‹ --- > 2 сервера Node.js

Моя конфигурация HAProxy:

global
  log 127.0.0.1   local0 debug
  maxconn 4096
  #debug
  #quiet
  user haproxy
  group haproxy

defaults
  log     global
  mode    http
  retries 3
  timeout client 50s
  timeout connect 5s
  timeout server 50s
  option dontlognull
  option httplog
  option redispatch
  option logasap
  option http-server-close
  balance  roundrobin

# Set up application listeners here.

listen admin
  bind 0.0.0.0:22002
  mode http
  stats uri /

frontend http
  maxconn 2000
  bind 0.0.0.0:8080
  default_backend servers-http
  capture cookie SSNID len 63


backend servers-http
   cookie SSNID insert nocache
   server 03PM1 127.0.0.1:8081 cookie 03PM1 check
   server 03PM2 127.0.0.1:8082 cookie 03PM2 check

Обратите внимание, я попробовал 1,5, чтобы увидеть, было ли это 1,4, но не в кости. Я также удалил stunnel впереди, чтобы увидеть, возможно ли что-то с SSL. Теперь пора погрузиться в источник...

Спасибо.

РЕДАКТИРОВАТЬ: я немного покопался и обнаружил, что в исходном коде HAProxy есть строка кода, которая предотвращает внедрение файлов cookie сохранения в ответ HTTP для ответов с кодом состояния HTTP менее 200. Это проблема для WebSockets, поскольку типичным ответом сервера в HTTP-рукопожатии является «101 протокол переключения». Я отправил несколько вопросов на форум HAProxy здесь: http://marc.info/?l=haproxy&m=140853225609985&w=2

Я не верю, что это действительно ошибка, учитывая, что HTTP RFC указывает, что поля заголовка ответа 1xx являются необязательными. Но я думаю, что, возможно, потребуется обновление, учитывая недавнюю популярность WebSockets. В зависимости от ответа на форуме и если они дадут мне зеленый свет, я отправлю свои изменения в проект, после чего обновлю этот пост.

ОБНОВЛЕНИЕ: я отправил некоторые изменения мастеру HAProxy 1.6, и они должны быть внесены в ближайшее время. Владелец проекта (Вилли) добавил несколько изменений к моему исходному изменению, и я протестировал их в своей среде. Если изменения в 1.6 окажутся полезными и не вызовут никаких проблем, насколько я понимаю, они будут возвращены к версиям 1.5 и, возможно, 1.4. Вы можете увидеть обмен электронной почтой здесь: http://marc.info/?l=haproxy&m=141080115708515&w =2


person borq    schedule 14.08.2014    source источник


Ответы (1)


Если вы просмотрите комментарии выше, вы увидите, что проблема заключается в самом коде HAProxy. Он пропускал изменение заголовка для кодов состояния ниже 200. Это не будет работать для WebSockets, поскольку они используют 101 в рукопожатии. Изменения в HAProxy версии 1.6 должны быть внесены в ближайшее время (по состоянию на 15.09.2015).

Я ответил на этот вопрос, а не полагался на приведенные выше изменения, поскольку может быть неясно, есть ли ответ, и я бы не хотел, чтобы кто-то думал, что на этом фронте нет активности, и тратил кучу времени.

person borq    schedule 15.09.2014