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

Липкий сеанс Haproxy не перенаправляется на другой сервер при сбое бэкэнда

У меня есть следующая конфигурация моего haproxy LB:

global
    daemon
    maxconn 2048

    # SSL
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private
    ssl-default-bind-ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

defaults
    log global
    mode    http
    option forwardfor

# handle incoming requests to port 80 (http)
frontend www-http
    bind 1.2.3.4:80
    reqadd X-Forwarded-Proto:\ http
    default_backend www-backend

# handle incoming requests to port 443 (https)
frontend www-https
    bind 1.2.3.4:443 ssl crt /etc/ssl/private/example.com.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
   # always use https
   redirect scheme https if !{ ssl_fc }

   # RR algorithm for load balancing
   balance roundrobin
   option httpclose

   # tracke which backend served specific user
   cookie _rails_srv insert

   # sticky sessions
   appsession _rails_session len 64 timeout 24h
   server s1 4.5.6.7:80 check cookie s1
   server s2 7.8.9.0:80 check cookie s2

Он привязан к 2 серверам приложений Rails в бэкэнде, и я использую cookie сеанса, предоставляемый Rails (_rails_session) для липкости сеанса.

Он отлично работает до тех пор, пока один из серверов не выйдет из строя, а затем клиенты с существующим сеансом связи с отказавшим сервером, которые пытаются получить доступ к этому серверу, получают 500 ответов об ошибках сервера вместо того, чтобы быть перенаправлены на другой функционирующий сервер.

Я подумал, что Haproxy автоматически перенаправит трафик на другой сервер при обнаружении сбоя. Я что-то не так делаю в конфигурации? Спасибо.

Вам не хватает redispatch вариант, видимо.

Из документация:

option redispatch / no option redispatch: включить или отключить перераспределение сеанса в случае сбоя подключения

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

Указание "option redispatch" позволит прокси-серверу нарушить их постоянство и перераспределить их на рабочий сервер.