Назад | Перейти на главную страницу

Похоже, что происходит «случайное» переключение между бэкэндом, соответствующим acl, и бэкэндом по умолчанию

У меня 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 (другие записи тоже полезны).