Продукты Р7
Корпоративный сервер 2024
Корпоративный сервер 2024
Сервер документов
Сервер документов
Редакторы
Редакторы
Корпоративный сервер 2019
Корпоративный сервер 2019
Графика
Графика
Команда
Команда
Мобильные редакторы
Мобильные редакторы
Облачный офис
Облачный офис
Почта
Почта
Органайзер
Органайзер
Дополнительно
Часто задаваемые вопросы
Разработчикам
Интеграции
Новые возможности

Пример реализации внешнего балансировщика Nginx для архитектуры High Available

Обновлено: 25.12.25

Описание

Продолжение пункта 7 инструкции ↗

Для минимизации времени простоя сервера с внешним балансером возможно реализовать отказоустойчивый кластер с использованием нескольких экземпляров Nginx.

Для реализации потребуется дополнительные IP адрес в сети, рекомендуется использовать две подсети для обеспечения безопасности доступа к кластерами других нод. Ноды будут использовать два виртуальных IP адрес при обращении к сервисам Api, Processing, Haproxy

В статье используется две подсети 45.145.64.x — белые IP адреса и 192.168.26.x — внутренняя сеть с серыми ip. Клиенты обращаются на сервер по белому ip адресу 45.145.64.212 (используются для доменных записей *.test3.s7-office.site и ds-cluster.test3.s7-office.site), а сервисы внутренние общаются по внутренней сети 192.

Привязка по подсетям и ip адресам:

  • nginx1 — адаптер ens8-192.168.26.26; ens3-45.145.64.210 vrrp
  • nginx2 — адаптер ens8-192.168.26.29; ens3-45.145.64.211 vrrp
  • vrrp ens8 192.168.25.27 ens3 45.145.64.212

Установка

На основной ноде потребуется дополнительно установить сервис:

dnf install nginx keepalived -y

На всех дополнительных нодах потребуется установка сервисов:

dnf install nginx keepalived -y

и добавьте в автозагрузку

systemctl enabled keepalived nginx

Настройка

1. На основной ноде

1.1. Создайте каталог

mkdir -p /usr/libexec/keepalived

И создайте файл /usr/libexec/keepalived/proxy_check.sh с содержимым:

#!/bin/bash
/bin/kill -0 $(cat /var/run/nginx.pid)

Скрипт проверяет, запущен ли процесс Nginx, используя его PID для мониторинга состояния службы.

1.2. Измените конфигурацию:

/etc/keepalived/keepalived.conf

global_defs {
  router_id proxy-server1
  enable_script_security
  script_user root
}
 
vrrp_script proxy_check {
  script "/usr/libexec/keepalived/proxy_check.sh"
  interval 2
  weight -20
  fall 2
  rise 2
}
 
vrrp_instance VIP_2 {
  interface ens3
  virtual_router_id 102
  priority 120
  advert_int 2
  state MASTER
  virtual_ipaddress {
    45.145.64.212 dev ens3
  }
  track_script {
    proxy_check weight 20
  }
  authentication {
    auth_type PASS
    auth_pass SecretPassword1
  }
 
vrrp_instance VIP_3 {
  interface ens8
  virtual_router_id 103
  priority 130
  advert_int 2
  state MASTER
  virtual_ipaddress {
    192.168.25.27 dev ens8
  }
  track_script {
    proxy_check weight 20
  }
  authentication {
    auth_type PASS
    auth_pass SecretPassword2
  }
}
}

Настройка для двух подсетей, где будет осуществляться применение виртуального IP для master и в случае если будет недоступен, то IP адрес получит backup.

Где введённые параметры:

  • router_id — ID роутера, уникальное значение на каждом узле;
  • script_user — пользователь, от имени которого будут запускаться скрипты VRRP;
  • vrrp_instance — Определяет экземпляр VRRP с именем VIP_2. Это имя используется для идентификации экземпляра связи, например по адаптеру ens3
  • interface — наименование интерфейса (возможно узнать командой ip a), к которому будет привязан keepalived;
  • virtual_router_id — ID виртуального роутера, общее значение на всех узлах;
  • priority — приоритет нод внутри виртуального роутера;
  • state — тип роли ноды в виртуальном роутере;
  • virtual_ipaddress — виртуальный IP;
  • auth_type — тип аутентификации в виртуальном роутере;
  • auth_pass — указывается пароль.

2. На дополнительных нодах

2.1. Скопируйте ранее установленные значения из /etc/hosts и укажите значения на новых нодах

2.2. Скопируйте конфигурации /etc/nginx/conf.d и каталог с сертификатами /etc/ssl и перенесите на новые ноды

2.3. Создайте каталог

mkdir -p /usr/libexec/keepalived

Создайте файл /usr/libexec/keepalived/haproxy_check.sh с содержимым:

#!/bin/bash
/bin/kill -0 $(cat /var/run/nginx.pid)

2.4. Измените конфигурацию на новых нодах

/etc/keepalived/keepalived.conf

global_defs {
  router_id proxy-server2
  enable_script_security
  script_user root
}
 
vrrp_script proxy_check {
  script "/usr/libexec/keepalived/proxy_check.sh"
  interval 2
  weight -20
  fall 2
  rise 2
}
 
vrrp_instance VIP_2 {
  interface ens3
  virtual_router_id 102
  priority 80
  advert_int 2
  state BACKUP
  virtual_ipaddress {
    45.145.64.212 dev ens3
  }
  track_script {
    proxy_check weight 20
  }
  authentication {
    auth_type PASS
    auth_pass SecretPassword1
  }
}
vrrp_instance VIP_3 {
  interface ens8
  virtual_router_id 103
  priority 90
  advert_int 2
  state BACKUP
  virtual_ipaddress {
    192.168.26.27 dev ens8
  }
  track_script {
    proxy_check weight 20
  }
  authentication {
    auth_type PASS
    auth_pass SecretPassword2
  }
}

За основу взята конфигурация с основной ноды и внесены правки в параметры:

  • router_id — укажите уникальные названия для каждой ноды
  • priority — приоритет ноды внутри виртуального роутера (рекомендуется установка значения ниже чем у предыдущей);
  • state — тип роли ноды в виртуальном роутере (для последующих указывается BACKUP);

2.5. Перезапустите на всех нодах сервисы

systemctl restart nginx keepalived

3. Настройка Корпоративного сервера

3.1. Внесите правки в конфигурации на всех нодах api

/opt/r7-office/Api/appsettings.json

"serviceRegistry": {
    "address": "http://192.168.25.27:7777"
  },

/opt/r7-office/Sso.Api/appsettings.json

"serviceRegistry": {
    "address": "http://192.168.25.27:7777"
  },

и нодах processing

/opt/r7-office/Processing/appsettings.json

"serviceRegistry": {
    "address": "http://192.168.25.27:7777",
  },

C указанием параметров подключения к виртуальному IP адресу 192.168.25.27

3.2. Перезапустите на нодах api и processing службы:

supervisorctl restart all

4. Потребуется дополнительная настройка firewall для всех нодах Nginx

Рекомендуется разделение зон с привязкой к внутренним и внешним интерфейсам, чтобы была возможность обезопасить комплекс из вне.