HAProxy настройка прокси для нескольких веб серверов
Понадобилось мне вывести сайт фирмы и веб интерфейс почты наружу, но загвоздка в том что сайты находятся на разных веб серверах, а внешний адрес только один. Можно использовать nginx в качестве обратного прокси, но я нашел для себя решение на базе haproxy.
Дано:
- Веб сервер с сайтом фирмы (192.168.0.7)
- Веб сервер с веб интерфейсом почты (192.168.0.4)
- Отдельный debian 10 с установленным haproxy (192.168.0.8)
Устанавливать на отдельную машину не обязательно, но для наглядности я разнес сервера. Итак для начала устанавливаем сам haproxy
1 |
sudo apt install haproxy |
И открываем конфиг файл для редактирования.
1 |
sudo nano /etc/haproxy/haproxy.cfg |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ # An alternative list with additional directives can be obtained from # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 tune.ssl.default-dh-param 2048 defaults log global mode tcp option tcplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http listen stats #Активируем статистику bind 192.168.0.8:8080 mode http stats enable stats enable stats hide-version stats scope . stats realm Haproxy\ Statistics stats auth admin:superpassword stats uri /stats frontend http #Перенаправляем трафик с 80 на 443 порт bind 192.168.0.8:80 mode http redirect scheme https code 301 frontend https #На основании заголовка SNI будем направлять трафик bind 192.168.0.8:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend mail if { req_ssl_sni -i mail.site.ru } use_backend site if { req_ssl_sni -i www.site.ru } backend mail mode tcp option ssl-hello-chk server mail 192.168.0.4:443 check backend site mode tcp option ssl-hello-chk server site 192.168.0.7:443 check |
Теперь проверяем конфиг файл на валидность:
1 |
sudo haproxy -c -f /etc/haproxy/haproxy.cfg |
И если все хорошо то перезапускаем службу:
1 |
sudo service haproxy restart |