HAProxy SSL Redirect для HTTP, но не для веб-сокетов

У меня есть HAProxy в качестве балансировщика нагрузки и динамического перенаправителя на мой веб-сервер и сервер веб-сокета, чтобы они могли работать через один и тот же порт. Мой сервер веб-сокетов требует подключения SSL на прокси-сервере ha.

Я хочу настроить HAProxy так, чтобы HTTP-трафик перенаправлялся на https, но веб-сокеты работали на портах бота 80 и 443 (ws и wss). Это возможно?

Моя текущая конфигурация:

global
 maxconn 50000
 user root
 group root
 stats socket /tmp/haproxy
 node lb1
 nbproc 1
 #daemon
 #debug

defaults
 log global
 retries 3
 option dontlog-normal
 timeout connect 10000ms
 timeout client 10000ms
 timeout server 10000ms
 timeout tunnel 24h
 maxconn 50000
 mode http
 option http-server-close


backend wwwServers
 mode http
 balance roundrobin
 option httpchk HEAD / HTTP/1.1
 server www1 127.0.0.1:1138 check

backend wsServers
 server ws1 127.0.0.1:1137 check

frontend  secured
 bind :443 ssl crt /cert/cert.pem
 reqadd X-Forwarded-Proto:\ https
 default_backend wwwServers

frontend unsecured
 bind :80
 acl is_websocket hdr(Upgrade) -i WebSocket
 use_backend wsServers if is_websocket
 redirect scheme https if !{ ssl_fc }
 default_backend wwwServers

но это перенаправляет соединение websocket перед обновлением, потому что прокси ha делает следующее, когда я его запускаю: правило перенаправления, помещенное после правила use_backend, все равно будет обрабатываться раньше.

Любая помощь будет оценена по достоинству.

Спасибо,


person boozelclark    schedule 24.12.2013    source источник
comment
Я нахожу решение с помощью перенаправления, только если не соединение с веб-сокетом. Незащищенная привязка внешнего интерфейса: 81,: 80 acl is_websocket hdr (Upgrade) -i Схема перенаправления WebSocket https if! {Ssl_fc}! Is_websocket use_backend wsServers if is_websocket default_backend wwwServers if is_websocket default_backend wwwServers if is_websocket default_backend www   -  person boozelclark    schedule 25.12.2013
comment
Если вы нашли решение, опубликуйте его как ответ и отметьте свой ответ как правильный, чтобы этот вопрос больше не отображался как открытый.   -  person ghoti    schedule 24.03.2014


Ответы (1)


Решение было таким:

frontend  secured
    bind :443 ssl crt /path/to/certificate.pem
    reqadd X-Forwarded-Proto:\ https
    acl is_websocket hdr(Upgrade) -i WebSocket
    use_backend wsServers if is_websocket
    default_backend wwwServers
frontend unsecured
    bind :81,:80
    acl is_websocket hdr(Upgrade) -i WebSocket
    redirect scheme https if !{ ssl_fc } !is_websocket
    use_backend wsServers if is_websocket
    default_backend wwwServers

если установлено соединение без ssl и без веб-сокета, оно перенаправляется.

person boozelclark    schedule 29.03.2014