Мы пытаемся настроить HAProxy (v1.5.1) для использования SSL.
Хотя нам это удалось, у нас есть некоторые проблемы с настройками циклического перебора:
Мы действительно хотим иметь сеансы Stick, но похоже, что haproxy отправляет все сеансы (из разных браузеров) на один и тот же узел (my.vm.2
), даже если другой узел (my.vm.1
) также доступен. Таким образом, похоже, что настройка кругового алгоритма работает неправильно.
Это наша текущая конфигурация, мы будем благодарны за помощь / идеи. :):
global
debug
stats socket /etc/haproxy/haproxysock level admin
tune.ssl.default-dh-param 2048
defaults
mode http
balance roundrobin
timeout connect 5s
timeout queue 300s
timeout client 300s
timeout server 300s
frontend https_frontend
bind *:8443
mode tcp
reqadd X-Forwarded-Proto:\ https
default_backend my_backend
backend my_backend
mode tcp
stick-table type ip size 200k expire 30m
stick on src
default-server inter 1s
server my.vm.1 my.vm.1:8443 check id 1 maxconn 500
server my.vm.2 my.vm.2:8443 check id 2 maxconn 500
option httpclose
option redispatch
retries 15
listen admin
bind *:8081
stats enable
stats refresh 1s
Я бы предложил выполнять всю вашу обработку SSL в HAProxy и использовать протокол прокси (send-proxy
и accept-sslproxy
), поэтому информация о клиенте передается от ssl-процессора на интерфейс + серверную часть. Это выглядит примерно так:
listen ssl-proxy
bind 1.2.3.4:443 ssl crt /etc/ssl/mycert.pem npn http/1.1
mode tcp
bind-process 2 3 4
server http 127.0.0.1:80 send-proxy
frontend dev
#Do whatever you want here since it is http
mode http
bind 1.2.3.4:80 name dev
bind 127.0.0.1:80 accept-proxy name accept-sslproxy
bind-process 1
acl is_ssl dst_port 443
reqadd X-Forwarded-Proto:\ https if is_ssl
default_backend my_backend
backend my_backend
mode http
#Do whatever you want here since it is http
Прикрепленные сеансы основаны на IP, поэтому разные браузеры по-прежнему будут использовать один и тот же сервер, потому что исходный IP-адрес остается тем же.