Балансировка Indeed AM 9 через HAProxy
Автор Alexey Yakovlev, Last modified by Alexey Yakovlev на 12 сентября 2025 08:58 AM

Оглавление

  1. Условия для развертывания
  2. Подготовка сертификата HAProxy
  3. Настройки со стороны Indeed AM
  4. Установка и настройка HAProxy
  5. Установка и настройка Keepalived

Для серверов Indeed AM возможно использовать балансировщик нагрузок HAProxy. Для обеспечения отказоустойчивости самого сервера с HAProxy рекомендуется развернуть второй сервер с HAProxy и использовать конфигурацию HAProxy + Keepalived.

В результате настроек сервер Indeed AM будет доступен только по общему имени, зайти на него по самому имени сервера не получится

Условия для развертывания

Предусловия:

  1. Установленный и настроен центр сертификации Windows.
  2. Развернутая система Indeed AM с основным и дополнительным серверами.
  3. Развернутые две машины с ОС Linux, с обновленными компонентами.
  4. Рекомендуется установить Midnight Commander - для работы с файлами. В качестве текстового редактора рекомендуется использовать mcedit. Для установки выполните: sudo apt-get install mc

Для настройки балансировки SSL Termination потребуется:

  • Сертификаты проверки подлинности (server authentication) для серверов Indeed AM.
  • Сертификаты проверки подлинности (server authentication) веб-сервера Haproxy (на общее имя).
  • Корневой сертификат домена.

Подготовка сертификата HAProxy

При использовании https требуется установить сертификаты проверки подлинности веб-сервера для каждого сервера с HAProxy. Можно использовать сертификаты полученные от доменного CA, либо сгенерировать сертификаты с помощью OpenSSL (Потребуется добавление всех полученных сертификатов в доверенные). 

При запросе сертификата указывается общее (Виртуальное) имя, используемое балансировщиками - это общее имя, через которое будет осуществляться взаимодействие с Indeed AM сервером. Данное имя является DNS записью типа “A”  для виртуального IP-адреса указанного в Keepalived. 

В данном примере используется имя haproxy-linux.indeed.local. 

Экспорт корневого сертификата УЦ

Требуется для того, чтобы сервер с HAProxy доверял серверам Indeed AM.

  1. Выполните экспорт корневого сертификата домена в формате .cer в кодировке Base-64.
  2. Скопируйте полученный сертификат на все машины с HAProxy в папку "/etc/haproxy/ssl/CA". Если данной папке нет, требуется создать её.

Запрос и установка доменных сертификатов

  1. Выполните запрос сертификата проверки подлинности веб-сервера. Выберите параметр "Общее имя" и укажите полное DNS-имя, которое будет использоваться для балансировщика нагрузки. Выберите параметр "Служба DNS" в категории "Дополнительное имя" и укажите полное DNS-имя, которое будет использоваться для балансировщика нагрузки. В данной инструкции будет использоваться: haproxy-linux.indeed.local.
  2. Обратите внимание! Сертификат должен быть с длиной ключа минимум 2048.

    Иначе при проверке конфигурационного файла HAProxy возникнет ошибка.

    ИЛИ

  3. Выполните экспорт сертификата с закрытым ключом с настройками, аналогичными скриншоту ниже:
  4. Установите пароль и сохраните сертификат.
  5. Скопируйте полученный сертификат на все машины с HAProxy.
  6. Для использования сертификата на haproxy необходимо выполнить следующие действия:
    • Извлечь из сертификата зашифрованный приватный ключ. Для этого выполните команду (Потребуется указать пароль, заданный при экспорте сертификата):
      openssl pkcs12 -in <Путь до вашего сертификата в формате pfx> -nocerts -out <Путь куда будет извлечен ключ>.
      Пример команды: openssl pkcs12 -in ./haproxy-linux.indeed.local.pfx -nocerts -out ./haproxy-linux.indeed.local.key
    • Извлечь сертификат в формате crt. Для этого выполните команду:
      openssl pkcs12 -in <Путь до вашего сертификата в формате pfx> -clcerts -nokeys -out <Путь куда будет извлечен сертификат в формате crt>.
      Пример команды: openssl pkcs12 -in ./haproxy-linux.indeed.local.pfx -clcerts -nokeys -out ./haproxy-linux.indeed.local.crt
    • Расшифровать приватный ключ. Для этого выполните команду (Потребуется указать пароль, заданный при экспорте сертификата):
      openssl rsa -in <Путь до извлеченного ключа> -out <Путь куда будет извлечен расшифрованный ключ>.
      Пример команды: openssl rsa -in ./haproxy-linux.indeed.local.key -out ./haproxy-linux.indeed.local-descr.key
    • Объединить расшифрованный ключ и сертификат в формате crt и скопировать в папку /etc/ssl/private/. Обязательно необходимо указать сначала ключ, а потом сертификат. Для этого выполните команду:
      sudo bash -c 'cat <Путь до извлеченного расшифрованного ключа> <Путь до сертификата в формате crt> >> /etc/ssl/private/<Имя сертификата с форматом pem>' .
      Пример команды: sudo bash -c 'cat ./haproxy-linux.indeed.local-descr.key ./haproxy-linux.indeed.local.crt >> /etc/ssl/private/haproxy-linux.indeed.local.pem'

      Все команды, описанные выше, выполнялись из директории с сертификатом pfx.
  7. Обратите внимание, что сертификаты должны располагаться в тех директориях, которые указаны в файле конфигурации HAProxy. В этой статье используется директория /etc/haproxy/ssl/, а в ней созданы папки private и CA. Сертификаты ca.cer и eaclient.cer должны располагаться в папке CA, а сертификат haproxy-linux.indeed.local.pem в папке private.

Настройки со стороны AM

Для корректной работы Indeed AM в режиме балансировки необходимо изменить переменные ENDPOINT_NAME_* в файле am/.env. В этих переменных необходимо указать общее имя балансировщика, в дальнейшем сервисы будут доступны только по этому адресу:


Установка HAProxy и Keepalived

Установка HAProxy

Данную установку необходимо произвести на каждом сервере с ОС Linux.

  1. Запустите терминал. Введите команду для установки HAProxy: sudo apt-get install haproxy
  2. Запустите Midnight Commander с root правами: sudo mc
  3. Откройте файл /etc/default/haproxy и добавьте строку ENABLED=1 (Эта настройка позволяет автоматически запускать HAProxy при загрузке системы)
  4. Отредактируйте  файл конфигурации HAProxy: /etc/haproxy/haproxy.cfg используя примеры. Описание настраиваемых параметров:
    • log - вести лог в /dev/log сохраняя в "объект" local0.
    • chroot - настройки безопасности, "запирающие" HAProxy в указанной директории.
    • stats socket - настройки сокета, по которому будет передаваться статистика.
    • maxconn - максимальное количество конкурирующих соединений на один процесс.
    • user - пользователь, от имени которого будет запущена программа.
    • group - группа пользователя, от имени которого будет запущена программа.
    • daemon - запуск процесса как демона.
    • log - указывает, в какой лог вести записи (global в данном случае означает, что используются параметры, заданные в секции global).
    • mode - устанавливает протокол взаимодействия, принимает одно из значений: tcp, http, health.
    • retries - количество попыток соединения с сервером в случае отказа.
    • option httplog - формат лога, в случае использования HAProxy для проксирования HTTP-запросов, рекомендуется включать данную настройку.
    • option redispatch - разрешает программе разорвать и переназначить сессию в случае отказа сервера.
    • contimeout - максимальное время ожидания успешного соединения с сервером.
    • bind :9000 - означает, что HAProxy будет ожидать запросы к порту 9000.
    • stats enable - включить отчеты со статистикой.
    • stats uri - установка адреса страницы с отчетом.
    • stats auth - логин и пароль для авторизации на странице со статистикой (может быть задано несколько).
    • cookie indeedid_proxy insert indirect nocache - строка сообщает HAProxy, что нужно установить cookie с именем indeedid_proxy. Параметр nocache означает, что этот тип трафика должен быть персональным и не кешировал его.

      HAProxy предлагает несколько алгоритмов балансировки, и в зависимости от вашей задачи можно выбрать наиболее подходящий:

      • roundrobin - каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету
      • static-rr - то же, что и roundrobin, только изменение весов на лету не даст никакого эффекта
      • leastconn - выбирает сервер с наименьшим количеством активных соединений
      • first - выбирает первый сервер с доступными слотами для соединения
      • source - на основе хэша IP-адреса отправителя запроса и весов серверов назначается сервер для соединения
      • uri - сервер выбирается на основе адреса (без параметров) страницы
      • url_param - сервер выбирается на основе GET-параметров запроса
      • hdr - сервер выбирается на основе заголовков запроса
      • rdp-cookie - сервер выбирается на основе cookie (если они не установлены, то применяется обычный round robin)

Пример конфигурационного файла:

global
#log 127.0.0.1 local0
log /dev/log local0 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
ca-base /etc/haproxy/ssl/CA
crt-base /etc/haproxy/ssl/private
tune.ssl.cachesize 100000
tune.ssl.lifetime 60000
tune.ssl.maxrecord 1460
tune.ssl.default-dh-param 2048
tune.maxrewrite 10000
tune.bufsize 20000
defaults
timeout connect 50000
timeout client 50000
timeout server 50000
maxconn 524288
option http-pretend-keepalive
option forwardfor
log global
option httplog


# Модуль статистики. Доступен по http://<IP адрес сервера>:9000/stats Login:admin
listen stats
mode http
bind *:9000
stats enable
stats hide-version
stats refresh 30s
stats realm Haproxy\ Statistics
stats uri /stats
stats auth admin:admin

frontend http_main
log 127.0.0.1 local0
mode http
bind *:443 ssl crt haproxy-linux.indeed.local.pem crt-ignore-err all verify optional ca-file eaclient.cer ciphers ALL:@SECLEVEL=1
option forwardfor
http-request redirect scheme https unless { ssl_fc }
http-request add-header X-IndeedAM-ClientCert %{+Q}[ssl_c_der,base64]
default_backend backend_am_servers_ssl

backend backend_am_servers_ssl #Балансировка AM серверов
mode http
log 127.0.0.1 local0
balance roundrobin
option prefer-last-server
option redispatch
option forwardfor
option httpchk
http-check send meth GET uri /am/core/api/v6/healthcheck/isHealthy hdr host haproxy-linux.indeed.local
option http-keep-alive
http-check expect status 200
default-server inter 10s downinter 5s fall 5 rise 2
cookie IndeedIdProxy insert indirect nocache secure httponly
server indeed1 am-server-linux.indeed.local:443 check inter 5000ms cookie indeed1 ssl verify required ca-file ca.cer
server indeed2 am-server-linux2.indeed.local:443 check inter 5000ms cookie indeed2 ssl verify required ca-file ca.cer

Запуск HAProxy

После заполнения файла конфигурации необходимо его проверить командой haproxy -c -f /etc/haproxy/haproxy.cfg.

Запустите HAProxy: sudo systemctl enable haproxy --now.

Перезапуск сервиса выполняется командами: sudo systemctl restart haproxy или sudo service haproxy restart.

Проверьте работу сервиса перейдя по ссылке: http://<IP адрес сервера Ubuntu c haproxy>:9000/stats Login: admin Pass: admin(для конфигурации из примера, указывается в параметре stats auth, блока listen stats ). Пример работы HAProxy:


Установка и настройка Keepalived

Данную установку необходимо произвести на каждом сервере с HAProxy.

  1. Запустите терминал. Введите команду для установки Keepalived: sudo apt-get install keepalived
  2. Запустите Midnight Commander с root правами: sudo mc
  3. Откройте файл /etc/sysctl.conf и добавьте строки:

    net.ipv4.ip_forward=1
    net.ipv4.ip_nonlocal_bind=1

  4. Выполните команду sudo sysctl -p для проверки добавленных изменений
  5. Создайте файл конфигурации /etc/keepalived/keepalived.conf
  6. Настройте файл конфигурации согласно примеру ( config-keepalived-base.cfg ):
    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
    }
    # Virtual interface
    # The priority specifies the order in which the assigned interface to take over in a failover
    vrrp_instance VI_01 {
    state MASTER # MASTER для основного сервера, BACKUP для резевного
    interface ens37 # Имя интерфейса можно узнать с помощью команды ip addr
    virtual_router_id 51
    priority 101 # Для основного сервера с haproxy 101, для резевного 100
    # The virtual ip address shared between the two loadbalancers
    virtual_ipaddress {
    192.168.100.222 # Виртуальный IP, по которому будет доступен keepalived
    }
    track_script {
    check_haproxy
    }
    }
    1. На дополнительном сервере конфигурационный файл будет отличаться параметрами: "state BACKUP" и "priority 100". ( config-keepalived-backup.cfg )
      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
      }
      # Virtual interface
      # The priority specifies the order in which the assigned interface to take over in a failover
      vrrp_instance VI_01 {
      state BACKUP # MASTER для основного сервера, BACKUP для резевного
      interface ens37 # Имя интерфейса можно узнать с помощью команды ip addr
      virtual_router_id 51
      priority 100 # Для основного сервера с haproxy 101, для резевного 100
      # The virtual ip address shared between the two loadbalancers
      virtual_ipaddress {
      192.168.100.222 # Виртуальный IP, по которому будет доступен keepalived
      }
      track_script {
      check_haproxy
      }
      }
  7. Для виртуального адреса из примера: 192.168.100.222 создайте A-запись в DNS (В данной инструкции используется и настраивается для haproxy-linux.indeed.local). DNS Manager>Forward Lookup Zones>New Host (A or AAAA). По этому адресу в дальнейшем будут доступны сервера Ubuntu c балансировщиком нагрузок HAProxy.

  8. Запустите keepalived командой sudo systemctl enable keepalived --now. Проверить работоспособность сервиса можно командой: sudo service keepalived status, а командой ip addr show ens37 (имя сетевого интерфейса) можно проверить поднялся ли виртуальный IP адрес.
    Для перезагрузки службы используйте команду: sudo service keepalived restart


Вложения 
 
 haproxy.cfg (2.03 кБ)
 .env (1.43 кБ)
 keepalived-master.conf (0.86 кБ)
 keepalived-slave.conf (0.86 кБ)
(2 голос(а))
Эта статья полезна
Эта статья бесполезна

Комментарии (0)
Портал технической поддержки компании Индид