Оглавление
- Условия для развертывания
- Подготовка сертификата HAProxy
- Настройки со стороны Indeed AM
- Установка и настройка HAProxy
- Установка и настройка Keepalived
Для серверов Indeed AM возможно использовать балансировщик нагрузок HAProxy. Для обеспечения отказоустойчивости самого сервера с HAProxy рекомендуется развернуть второй сервер с HAProxy и использовать конфигурацию HAProxy + Keepalived.
В результате настроек сервер Indeed AM будет доступен только по общему имени, зайти на него по самому имени сервера не получится
Условия для развертывания
Предусловия:
- Установленный и настроен центр сертификации Windows.
- Развернутая система Indeed AM с основным и дополнительным серверами.
- Развернутые две машины с ОС Linux, с обновленными компонентами.
- Рекомендуется установить 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.
- Выполните экспорт корневого сертификата домена в формате .cer в кодировке Base-64.
- Скопируйте полученный сертификат на все машины с HAProxy в папку "/etc/haproxy/ssl/CA". Если данной папке нет, требуется создать её.
Запрос и установка доменных сертификатов
- Выполните запрос сертификата проверки подлинности веб-сервера. Выберите параметр "Общее имя" и укажите полное DNS-имя, которое будет использоваться для балансировщика нагрузки. Выберите параметр "Служба DNS" в категории "Дополнительное имя" и укажите полное DNS-имя, которое будет использоваться для балансировщика нагрузки. В данной инструкции будет использоваться: haproxy-linux.indeed.local.

- Обратите внимание! Сертификат должен быть с длиной ключа минимум 2048.
 Иначе при проверке конфигурационного файла HAProxy возникнет ошибка.
 ИЛИ

- Выполните экспорт сертификата с закрытым ключом с настройками, аналогичными скриншоту ниже:

- Установите пароль и сохраните сертификат.
- Скопируйте полученный сертификат на все машины с HAProxy.
- Для использования сертификата на 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.
- Обратите внимание, что сертификаты должны располагаться в тех директориях, которые указаны в файле конфигурации 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.
- Запустите терминал. Введите команду для установки HAProxy: sudo apt-get install haproxy
- Запустите Midnight Commander с root правами: sudo mc
- Откройте файл /etc/default/haproxy и добавьте строку ENABLED=1 (Эта настройка позволяет автоматически запускать HAProxy при загрузке системы)
- Отредактируйте файл конфигурации HAProxy: /etc/haproxy/haproxy.cfg используя примеры. Описание настраиваемых параметров:
Пример конфигурационного файла:
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.
- Запустите терминал. Введите команду для установки Keepalived: sudo apt-get install keepalived
- Запустите Midnight Commander с root правами: sudo mc
- Откройте файл /etc/sysctl.conf и добавьте строки:
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind=1

- Выполните команду sudo sysctl -p для проверки добавленных изменений
- Создайте файл конфигурации /etc/keepalived/keepalived.conf
- Настройте файл конфигурации согласно примеру ( 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
}
}
- На дополнительном сервере конфигурационный файл будет отличаться параметрами: "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
}
}
- Для виртуального адреса из примера: 192.168.100.222 создайте A-запись в DNS (В данной инструкции используется и настраивается для haproxy-linux.indeed.local). DNS Manager>Forward Lookup Zones>New Host (A or AAAA). По этому адресу в дальнейшем будут доступны сервера Ubuntu c балансировщиком нагрузок HAProxy.

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