Вопрос или проблема
Я настраиваю KeepAlived для HA на nginx.
В моей конфигурации это должно работать так:
VIP 1 – 192.168.97.180 (веб-страницы)
-> Сервер 1 – 192.168.97.200
-> Сервер 2 – 192.168.97.230
VIP 2 – 192.168.97.181 (REST API)
-> Сервер 1 – 192.168.97.201
-> Сервер 2 – 192.168.97.231
Тот же URL, который я тестирую на 192.168.97.180, должен возвращать http 200, НО на vip 192.168.97.181 должен возвращать ошибку 404 не найдено.
Но когда я выполняю curl для тестирования URL, он всегда возвращает 404… У меня складывается впечатление, что он перенаправляет на IP сервера 192.168.97.220, а не на VIP-сервера.
vrrp_instance VI_1 {
state MASTER
interface ens37
virtual_router_id 01
priority 150
advert_int 1
unicast_src_ip 192.168.97.200
unicast_peer {
192.168.97.230
}
virtual_ipaddress {
192.168.97.180/24
}
}
vrrp_instance VI_2 {
state MASTER
interface ens37
virtual_router_id 02
priority 150
advert_int 1
unicast_src_ip 192.168.97.201
unicast_peer {
192.168.97.231
}
virtual_ipaddress {
192.168.97.181/24
}
}
Журнал Keepalived:
Dec 18 11:59:35 systemd[1]: /usr/lib/systemd/system/keepalived.service:8: PIDFile= указывает на путь ниже устаревшего каталога /var/run/, обновление /var/run/keepalived.pid → /run/keepalived.pid; пожалуйста, обновите файл юнита соответственно.
Dec 18 11:59:35 systemd[1]: Запуск LVS и монитора высокой доступности VRRP...
Dec 18 11:59:35 Keepalived[81578]: Запуск Keepalived v2.3.1 (05/24,2024)
Dec 18 11:59:35 Keepalived[81578]: Работает на Linux 5.14.0-427.42.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Oct 18 14:35:40 EDT 2024 (собран для Linux 5.14.0)
Dec 18 11:59:35 Keepalived[81578]: Командная строка: '/usr/sbin/keepalived' '-D'
Dec 18 11:59:35 Keepalived[81578]: Открытие файла '/etc/keepalived/keepalived.conf'.
Dec 18 11:59:35 Keepalived[81578]: Файл конфигурации /etc/keepalived/keepalived.conf
Dec 18 11:59:47 Keepalived[81649]: УВЕДОМЛЕНИЕ: установка параметра конфигурации max_auto_priority должна привести к лучшей производительности keepalived
Dec 18 11:59:47 Keepalived[81649]: Запуск дочернего процесса VRRP, pid=81650
Dec 18 11:59:47 systemd[1]: Запущен LVS и монитор высокой доступности VRRP.
Dec 18 11:59:47 Keepalived_vrrp[81650]: Регистрация рефлектора netlink ядра
Dec 18 11:59:47 Keepalived_vrrp[81650]: Регистрация канала команд netlink ядра
Dec 18 11:59:47 Keepalived_vrrp[81650]: Назначен адрес 192.168.97.220 для интерфейса ens37
Dec 18 11:59:47 Keepalived_vrrp[81650]: Регистрация канала бесплатного ARP
Dec 18 11:59:47 Keepalived_vrrp[81650]: (VI_1) удаление VIP.
Dec 18 11:59:47 Keepalived_vrrp[81650]: (VI_2) удаление VIP.
Dec 18 11:59:47 Keepalived[81649]: Запуск завершен
Dec 18 11:59:47 Keepalived_vrrp[81650]: (VI_1) Переход в РЕЗЕРВНОЕ СОСТОЯНИЕ (init)
Dec 18 11:59:47 Keepalived_vrrp[81650]: (VI_2) Переход в РЕЗЕРВНОЕ СОСТОЯНИЕ (init)
Dec 18 11:59:47 Keepalived_vrrp[81650]: Пул сокетов VRRP: [ifindex( 5), family(IPv4), proto(112), fd(13,14) , unicast, address(192.168.97.200)]
Dec 18 11:59:47 Keepalived_vrrp[81650]: Пул сокетов VRRP: [ifindex( 5), family(IPv4), proto(112), fd(15,16) , unicast, address(192.168.97.201)]
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_1) Время ожидания рекламы
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_1) Переход в МАСТЕР СОСТОЯНИЕ
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_1) настройка VIP.
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_1) Отправка/очередь бесплатных ARP на ens37 для 192.168.97.180
Dec 18 11:59:50 Keepalived_vrrp[81650]: Отправка бесплатного ARP на ens37 для 192.168.97.180
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_2) Время ожидания рекламы
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_2) Переход в МАСТЕР СОСТОЯНИЕ
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_2) настройка VIP.
Dec 18 11:59:50 Keepalived_vrrp[81650]: (VI_2) Отправка/очередь бесплатных ARP на ens37 для 192.168.97.181
Dec 18 11:59:50 Keepalived_vrrp[81650]: Отправка бесплатного ARP на ens37 для 192.168.97.181
Dec 18 11:59:55 Keepalived_vrrp[81650]: (VI_1) Отправка/очередь бесплатных ARP на ens37 для 192.168.97.180
Dec 18 11:59:55 Keepalived_vrrp[81650]: Отправка бесплатного ARP на ens37 для 192.168.97.180
Dec 18 11:59:55 Keepalived_vrrp[81650]: (VI_2) Отправка/очередь бесплатных ARP на ens37 для 192.168.97.181
Dec 18 11:59:55 Keepalived_vrrp[81650]: Отправка бесплатного ARP на ens37 для 192.168.97.181
Dec 18 11:59:55 Keepalived_vrrp[81650]: Отправка бесплатного ARP на ens37
Что я делаю не так?
Ответ или решение
Проблема с перенаправлением запросов в Keepalived для Nginx
Вы описали ситуацию, в которой ваш конфиг Keepalived работает некорректно, что приводит к ответу HTTP 404 при обращении к VIP, который должен обслуживать веб-страницы, а не REST API. Разберем возможные причины и пути их решения.
1. Проверка конфигурации VIP
Ваши виртуальные IP-адреса (VIP) настроены следующим образом:
- VIP 1 (192.168.97.180) должен перенаправлять запросы на сервера 1 (192.168.97.200) и 2 (192.168.97.230) для обработки веб-страниц.
- VIP 2 (192.168.97.181) должен направлять запросы на сервера 1 (192.168.97.201) и 2 (192.168.97.231) для обработки REST API.
Убедитесь, что на серверах 1 и 2 запущен Nginx и корректно настроены соответствующие виртуальные хосты, которые прослушивают указанные IP-адреса. Для VIP 1 должен быть настроен корневой каталог сервера с веб-страницами, а для VIP 2 — с API.
2. Логи Keepalived
Из логов видно, что Keepalived установил VIP адреса и активно отправляет кампании ARP, что говорит о том, что VIP адреса были успешно получены:
( VI_1 ) sending gratuitous ARP on ens37 for 192.168.97.180
( VI_2 ) sending gratuitous ARP on ens37 for 192.168.97.181
Тем не менее, обратите внимание на сообщения о переходе в состояние BACKUP:
( VI_1 ) entering BACKUP STATE (init)
( VI_2 ) entering BACKUP STATE (init)
Это может указывать на то, что текущий мастер-узел не отвечает или его конфигурация не правильна. Проверьте, чтобы все участвующие ноды имели правильные данные и были доступны по IP-адресу.
3. Проверка Nginx
Убедитесь, что конфигурация Nginx корректная для обоих VIP. Например, конфигурация для VIP 1 может выглядеть как:
server {
listen 80;
server_name 192.168.97.180;
location / {
root /var/www/html;
index index.html index.htm;
}
}
Для VIP 2:
server {
listen 80;
server_name 192.168.97.181;
location /api {
proxy_pass http://backend_api;
# другие настройки
}
}
Запустите команду для проверки конфигурации Nginx:
nginx -t
Если есть ошибки, исправьте их, затем перезагрузите Nginx.
4. Проверка сетевой конфигурации
Убедитесь, что ваша сеть настроена правильно и что нет конфликтов. Проверьте, активен ли маршрут для доступа к VIP с необходимых интерфейсов и что фаервол не блокирует необходимые запросы.
Вы можете использовать утилиты, такие как ping
и traceroute
, для диагностики проблем с сетевыми соединениями.
5. Тестирование
Запустите тест с использованием curl
, чтобы убедиться, что VIP 1 возвращает корректный ответ HTTP 200, а VIP 2 — 404:
curl -I http://192.168.97.180
curl -I http://192.168.97.181
Если VIP 1 возвращает 404, это означает, что запрос не попадает на нужный сервер или виртуальный хост.
Заключение
Убедитесь, что вы проверили и исправили все упомянутые настройки: конфигурацию Keepalived, Nginx, сетевые маршруты и т.д. Если проблемы продолжаются, возможно, имеет смысл посмотреть на уровень сетевого трафика с помощью tcpdump
или аналогичного инструмента для более глубокого анализа.
Помните, что точная диагностика проблемы требует последовательного устранения возможных неисправностей и внимательного изучения логов.