Вопрос или проблема
Я использую nginx и NginxHttpUpstreamModule для балансировки нагрузки. Моя конфигурация очень простая:
upstream lb {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 89;
server_name localhost;
location / {
proxy_pass http://lb;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Но с этой конфигурацией, когда один из двух серверов находится в отключенном состоянии, nginx все равно перенаправляет запросы к нему, и это приводит к таймаутам в половине случаев 🙁
Есть ли какое-либо решение, чтобы nginx автоматически перенаправлял запрос к другому серверу, когда он обнаруживает неработающий сервер.
Спасибо.
Я думаю, что это происходит потому, что nginx не обнаруживает, что upstream не работает, потому что он находится на той же машине.
Опции, которые вам нужны:
proxy_next_upstream и
proxy_connect_timeout.
Попробуйте это:
location / {
proxy_pass http://lb;
proxy_redirect off;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Пожалуйста, ознакомьтесь с документацией: https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
В основном, если ошибка обнаружена, бекенд будет помечен как неработающий на x секунд, после чего будет сделана новая попытка. Если вы продолжаете видеть соединения, вероятно, nginx продолжает проверять, стал ли бекенд доступен.
Тем не менее, он должен попробовать следующую запись в блоке upstream, так что вы не должны на самом деле видеть, что нет доступных бекендов, если только один не работает.
Ответ или решение
Настройка автоматического переключения на резервные серверы (failover) в Nginx с использованием модуля NginxHttpUpstreamModule — важный аспект обеспечения надежной работы веб-серверов. Если ваша конфигурация не обрабатывает ситуации, когда один из серверов недоступен, это может привести к значительным задержкам и сбоям. Рассмотрим, как правильно настроить автоматическое переключение на запасные серверы в Nginx.
Существующая конфигурация
Вы использовали следующую конфигурацию:
upstream lb {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 89;
server_name localhost;
location / {
proxy_pass http://lb;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Проблема
Когда один из серверов (например, 127.0.0.1:8081 или 127.0.0.1:8082) недоступен, Nginx продолжает отправлять запросы на этот сервер, что приводит к тайм-аутам и задержкам. Это может быть связано с тем, что Nginx не может установить соединение с сервером, и вам необходимо настроить параметры обработки ошибок.
Решение: Включение автоматического переключения на резервный сервер
Чтобы изменить поведение Nginx и настроить автоматическое переключение при неудаче соединения с бэкенд-сервером, добавьте следующие директивы в блок location
:
location / {
proxy_pass http://lb;
proxy_redirect off;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 2; # Установите тайм-аут соединения
proxy_read_timeout 10; # Установите тайм-аут на чтение ответа
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Объяснение директив
-
proxy_next_upstream: Эта директива указывает Nginx, когда следует пытаться маршрутизировать запрос к следующему серверу в списке. Вы можете настроить её на обработку ошибок, тайм-аутов, недопустимых заголовков и определённых кодов состояния (например, 500). Это обеспечит плавное переключение на рабочий бэкенд в случае сбоя.
-
proxy_connect_timeout: Установите тайм-аут для подключения к бэкенд-серверу. В нашем случае это значение установлено на 2 секунды. Если соединение не будет установлено за это время, будет выполнена попытка соединения с другим сервером.
-
proxy_read_timeout: Директива, задающая время ожидания ответа от бэкенд-сервера после успешного подключения.
Заключение
С вышеописанными изменениями в конфигурации Nginx должен корректно обрабатывать ситуации, когда один из бэкенд-серверов выходит из строя. Теперь, при наличии недоступных серверов, Nginx автоматически переключится на другой сервер, предотвращая тайм-ауты и сбои в обслуживании клиентов. Для более детальной информации, вы можете ознакомиться с документацией Nginx.
Настройка такого поведения значительно повысит надежность вашего приложения и улучшит опыт пользователей.