У меня HAProxy действует как прокси перед:
Моя проблема в том, что время от времени мои соединения правильно проксируются на мой кластер socket.io, а затем случайным образом он возвращается к маршрутизации на NGinx, что, очевидно, раздражает и бессмысленно, поскольку NGinx не означает, что он не обрабатывает запрос.
Это происходит при запросе URL в формате:
http://mydomain.com/backends/*
В конфигурации HAProxy есть ACL, соответствующий пути '/ backends / *'.
Вот упрощенная версия моей конфигурации HAProxy (удалены лишние несвязанные записи и изменены имена):
global
daemon
maxconn 4096
user haproxy
group haproxy
nbproc 4
defaults
mode http
timeout server 86400000
timeout connect 5000
log global
#this frontend interface receives the incoming http requests
frontend http-in
mode http
#process all requests made on port 80
bind *:80
#set a large timeout for websockets
timeout client 86400000
# Default Backend
default_backend www_backend
# Loadfire (socket cluster)
acl is_loadfire_backends path_beg /backends
use_backend loadfire_backend if is_loadfire_backends
# NGinx backend
backend www_backend
server www_nginx localhost:12346 maxconn 1024
# Loadfire backend
backend loadfire_backend
option forwardfor # This sets X-Forwarded-For
option httpclose
server loadfire localhost:7101 maxconn 2048
Меня действительно сбивает с толку, почему поведение кажется «случайным», поскольку его трудно воспроизвести, и его трудно отладить.
Я ценю любое понимание этого.
Проблема была вызвана тем фактом, что когда несколько HTTP-запросов передаются по одному и тому же TCP-соединению, первый запрос проходит через процесс сопоставления acl и переключение контекста для получения бэкэнда, но это не выполняется для следующих подключений.
Итак, чтобы решить проблему, в разделе внешнего интерфейса необходимо выполнить одно из следующих действий:
option httpclose
или
option http-server-close
Вышеупомянутое сработало для меня (я выбрал последнее, http-server-close).
Я нашел эту запись в документации очень полезной: Документация HAProxy в Google Docs для http-close-server (другие записи тоже полезны).