Product SiteDocumentation Site

17.7.2. Настройка серверов HAProxy

Конфигурация балансировщика нанрузки
В данной конфигурации используется служба Keepalived и виртуальный IP-адрес, общий для главного (Master) и резервного (Slave) узлов. Служба Keepalived связывает виртуальный IP-адрес с главным узлом и отслеживает доступность HAProxy. Если служба обнаруживает, что HAProxy не отвечает, то она связывает виртуальный адрес с вспомогательным узлом, что минимизирует время недоступности сервера. Пользователи при обращении к OpenUDS должны использовать этот виртуальный IP-адрес. Этот же виртуальный IP-адрес следует использовать при регистрации OpenUDS Actor (см. Подготовка шаблона виртуальной машины).
На основном узле сгенерировать сертификат:
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /root/ssl.key -out /root/ssl.crt
Создать файл .pem, выполнив команду (предварительно может понадобиться создать каталог /etc/openssl/private):
# cat /root/ssl.crt /root/ssl.key > /etc/openssl/private/haproxy.pem

Примечание

Сертификат, созданный на первичном сервере HAProxy, необходимо скопировать в каталог /etc/openssl/private на вторичном сервере. Если используется собственный сертификат, его необходимо скопировать на оба сервера (основной и дополнительный).

Важно

Порты, используемые HAProxy (в примере 80, 443, 1443, 10443), должны быть свободны.
На обоих узлах:
  1. Установить пакеты haproxy и keepalived:
    # apt-get install haproxy keepalived
    
  2. Заменить содержимое файла /etc/haproxy/haproxy.cfg следующим:
    global
            log /dev/log    local0
            log /dev/log    local1 notice
            chroot /var/lib/haproxy
            stats socket /var/lib/haproxy/admin.sock mode 660 level admin
            stats timeout 30s
            maxconn 2048
            user _haproxy
            group _haproxy
            daemon
    
            # Default SSL material locations
            # ca-base /etc/openssl/certs
            # crt-base /etc/openssl/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/
            ssl-default-bind-options ssl-min-ver TLSv1.2 prefer-client-ciphers
            # ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA267:TLS_AES_267_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA267
            ssl-default-bind-ciphers ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES267:ECDH+AES128:!aNULL:!SHA1:!AESCCM
    
            # ssl-default-server-options ssl-min-ver TLSv1.2
            # ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA267:TLS_AES_267_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA267
            # ssl-default-server-ciphers ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES267:ECDH+AES128:!aNULL:!SHA1:!AESCCM
    
           tune.ssl.default-dh-param 2048
    
    
    defaults
            log     global
            mode    http
            option  httplog
            option  dontlognull
            option  forwardfor
            retries 3
            option  redispatch
    
            stats enable
            stats uri /haproxystats
            stats realm Strictly\ Private
            stats auth stats:haproxystats
    
            timeout connect 5000
            timeout client  50000
            timeout server  50000
    
    frontend http-in
            bind *:80
            mode http
            http-request set-header X-Forwarded-Proto http
            default_backend openuds-backend
    frontend https-in
            bind *:443 ssl crt /etc/openssl/private/haproxy.pem
            mode http
            http-request set-header X-Forwarded-Proto https
            default_backend openuds-backend
    
    frontend tunnel-in
            bind *:1443
            mode tcp
            option tcplog
            default_backend tunnel-backend-ssl
    
    frontend tunnel-in-guacamole    # HTML5
            bind *:10443
            mode tcp
            option tcplog
            default_backend tunnel-backend-guacamole
    backend openuds-backend
            option http-keep-alive
            balance roundrobin
            server udss1 192.168.0.85:80 check inter 2000 rise 2 fall 5
            server udss2 192.168.0.86:80 check inter 2000 rise 2 fall 5
    backend tunnel-backend-ssl
            mode tcp
            option tcplog
            balance roundrobin
            server udst1 192.168.0.87:7777 check inter 2000 rise 2 fall 5
            server udst2 192.168.0.88:7777 check inter 2000 rise 2 fall 5
    
    backend tunnel-backend-guacamole
            mode tcp
            option tcplog
            balance source
            server udstg1 192.168.0.87:10443 check inter 2000 rise 2 fall 5
            server udstg2 192.168.0.88:10443 check inter 2000 rise 2 fall 5
    
  3. Включить в ядре поддержку двух IP-адресов:
    # echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
    # sysctl -p
    
  4. Настроить службу Keepalived. Для этого создать файл /etc/keepalived/keepalived.conf. Содержимое файла зависит от узла, который настраивается:
    • на главном узле:
      global_defs {
          # Keepalived process identifier
          lvs_id haproxy_DH
      }
      # Script used to check if HAProxy is running
      vrrp_script check_haproxy {
          script "killall -0 haproxy"
          interval 2
          weight 2
      }
      # Виртуальный интерфейс
      # The priority specifies the order in which the assigned interface to take over in a failover
      vrrp_instance VI_01 {
          state MASTER
          interface enp0s3
          virtual_router_id 51
          priority 101
          # Виртуальный IP-адрес
          virtual_ipaddress {
              192.168.0.49
          }
          track_script {
              check_haproxy
          }
      }
      
      где enp0s3 — интерфейс, для виртуального IP (узнать имя сетевого интерфейса можно, выполнив команду ip a).
    • на вспомогательном узле:
      global_defs {
          # Keepalived process identifier
          lvs_id haproxy_DH_passive
      }
      # Script used to check if HAProxy is running
      vrrp_script check_haproxy {
          script "killall -0 haproxy"
          interval 2
          weight 2
      }
      # Виртуальный интерфейс
      # The priority specifies the order in which the assigned interface to take over in a failover
      vrrp_instance VI_01 {
          state SLAVE
          interface eth0
          virtual_router_id 51
          priority 100
          # Виртуальный IP-адрес
          virtual_ipaddress {
              192.168.0.49
          }
          track_script {
              check_haproxy
          }
      }
      
      где eth0 — интерфейс, для виртуального IP (узнать имя сетевого интерфейса можно, выполнив команду ip a).
  5. Запустить службы haproxy и keepalived:
    # systemctl enable --now haproxy
    # systemctl enable --now keepalived
    
  6. Убедиться, что виртуальный IP активен на основном сервере:
    $ ip a |grep enp0s3
    2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        inet 192.168.0.52/24 brd 192.168.0.255 scope global noprefixroute enp0s3
        inet 192.168.0.49/32 scope global enp0s3