Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
citrix:haproxy-балансировщик-нагрузки-и-reverse-proxy-для-xenapp-и-других-https-сервисов-на-одном-ip [2019/03/13 07:44] – [Исходная ситуация] admin | citrix:haproxy-балансировщик-нагрузки-и-reverse-proxy-для-xenapp-и-других-https-сервисов-на-одном-ip [2019/03/20 10:27] (current) – admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ======Исходная ситуация====== | ||
+ | |||
+ | На одном физическом сервере, | ||
+ | |||
+ | Задача - настроить reverse-proxy для этих сервисов, | ||
+ | |||
+ | До этого момента в качестве reverse-proxy использовался nginx. И на первый взгляд он пригоден для этой цели. Например, | ||
+ | |||
+ | Видимо нужен reverse-proxy, | ||
+ | |||
+ | ======Решение====== | ||
+ | Решением стало внедрение **haproxy** (версии не ниже **1.5**).\\ | ||
+ | Устанавливать на **Ubuntu 16.04** можно из стандартного репозитория. | ||
+ | Устанавливаем **haproxy** и проверяем версию: | ||
+ | < | ||
+ | haproxy -vv</ | ||
+ | В выводе этой команды должно быть:\\ | ||
+ | < | ||
+ | и\\ | ||
+ | < | ||
+ | OpenSSL library supports SNI : yes</ | ||
+ | |||
+ | Теперь в файл конфигурации **/ | ||
+ | < | ||
+ | log 127.0.0.1 local5 notice | ||
+ | user haproxy | ||
+ | group haproxy | ||
+ | |||
+ | # Adjust the timeout to your needs | ||
+ | defaults | ||
+ | timeout client 30000s | ||
+ | timeout server 30000s | ||
+ | timeout connect 10s | ||
+ | |||
+ | ############################################################# | ||
+ | ############ | ||
+ | ########################################################### | ||
+ | frontend https_proxy | ||
+ | bind *:443 | ||
+ | mode tcp | ||
+ | log 127.0.0.1 local6 | ||
+ | option tcplog | ||
+ | tcp-request inspect-delay 5s | ||
+ | tcp-request content accept if { req_ssl_hello_type 1 } | ||
+ | |||
+ | use_backend ssh if { payload(0, | ||
+ | use_backend xd_https if { req_ssl_sni -i xd.autosys.tk } | ||
+ | use_backend sstp_https if { req_ssl_sni -i sstp.autosys.tk } | ||
+ | # default_backend xd_https | ||
+ | default_backend sstp_https | ||
+ | | ||
+ | ########################################################## | ||
+ | ### | ||
+ | ###################################################### | ||
+ | |||
+ | frontend http | ||
+ | # | ||
+ | log 127.0.0.1 local7 debug #/ | ||
+ | mode tcp | ||
+ | bind *:80 | ||
+ | # redirect to HTTPS | ||
+ | | ||
+ | | ||
+ | |||
+ | ######################################################################### | ||
+ | ####----- Backends----------###################### | ||
+ | ######################################################################## | ||
+ | |||
+ | backend sstp_https | ||
+ | mode tcp | ||
+ | server sstp_ssl 192.168.77.138: | ||
+ | |||
+ | backend xd_https | ||
+ | mode tcp | ||
+ | # option ssl-hello-chk | ||
+ | server xdwebi xd.autosys.tk: | ||
+ | |||
+ | backend ssh | ||
+ | mode tcp | ||
+ | server ssh_haproxy 127.0.0.1: | ||
+ | </ | ||
+ | |||
+ | Старые версии продуктов **Citrix** (**Citrix Secure Gateway** и **Citrix Receiver**) не работали без строки **default_backend xd_https** (вероятно не в каждом запросе **HTTPS** был заголовок **SNI**), однако на последних версиях (**Citrix Secure Gateway 3.3.5** и **Linux Citrix Receiver 13.7 x64**) все работает без этой строки, | ||
+ | Также в приведенном конфиге показано как пробросить **SSH** с портов **80** и **443**.\\ | ||
+ | |||
+ | ====== Отказоустойчивая балансировка Secure Gateway ====== | ||
+ | Предположим, | ||
+ | Поднимаем второй хост с Web-интерфейсом и Secure Gateway и настраиваем также как и первый. Сертификат берем тот же что и на первом хосте. Вся магия будет на **haproxy** в раздельчике **backend**. В него нужно добавить **balance source**, тип хеширования IP-адреса источника **hash-type consistent** и второй сервер с **SecureGateway**. | ||
+ | backend xenapp | ||
+ | option tcplog | ||
+ | log ${LOCAL_SYSLOG}: | ||
+ | hash-type consistent | ||
+ | balance source | ||
+ | mode tcp | ||
+ | option ssl-hello-chk | ||
+ | server xenappsrv xenapp.domain.com: | ||
+ | server xenappsrv2 xenapp2.domain.com: | ||
+ | В результате у нас будет балансировка типа **source**, при которой клиент будет работать с тем сервером, | ||
+ | Также, иногда нужно немного расширить таймаут проверки **ssl-hello-check**. Для этого перед строкой **option ssl-hello-chk** добавить **timeout check 5000** (ну или сколько надо в миллисекундах). | ||
+ | |||
+ | |||
+ | |||
+ | ======Включаем логи на для haproxy====== | ||
+ | HAproxy очень продвинутый балансировщик, | ||
+ | Но может писать логи на удаленный или локальный сервер **syslogd**.\\ | ||
+ | |||
+ | Сначала нужно разрешить syslogd принимать логи по UDP.\\ | ||
+ | Для этого в файле **/ | ||
+ | |||
+ | Затем в файле **/ | ||
+ | < | ||
+ | local0.* | ||
+ | local1.* | ||
+ | local2.* | ||
+ | </ | ||
+ | Тем самым я объявил **facilities** с именами **local10**, | ||
+ | |||
+ | А теперь можно настроить логи в конфигурации **haproxy**. У меня получилось примерно так: \\ | ||
+ | < | ||
+ | global | ||
+ | log ${LOCAL_SYSLOG}: | ||
+ | |||
+ | |||
+ | defaults | ||
+ | option tcplog | ||
+ | log global | ||
+ | # Adjust the timeout to your needs | ||
+ | timeout client 3000s | ||
+ | timeout server 3000s | ||
+ | timeout connect 10s | ||
+ | |||
+ | # Single VIP | ||
+ | listen ssl :443 | ||
+ | tcp-request inspect-delay 5s | ||
+ | tcp-request content accept if { req_ssl_hello_type 1 } | ||
+ | use_backend xenapp if { req_ssl_sni -i xenapp.mydomain.org } | ||
+ | use_backend mydomain if { req_ssl_sni -i mydomain.org } | ||
+ | default_backend xenapp | ||
+ | |||
+ | backend xenapp | ||
+ | log ${LOCAL_SYSLOG}: | ||
+ | mode tcp | ||
+ | server xenappsrv xenapp.local: | ||
+ | |||
+ | backend mydomain | ||
+ | log ${LOCAL_SYSLOG}: | ||
+ | mode tcp | ||
+ | server mydomainsrv mydomain.local: | ||
+ | |||
+ | Всё. Еще может понадобиться создать файлы логов, а то **syslogd** откажется стартовать.\\ | ||
+ | Перезапускаем **haproxy** и **syslogd** и радуемся логам.\\ | ||