автоматическое переключение на резервный сервер и балансировка нагрузки nginx

Вопрос или проблема

Я использую 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;
}

Объяснение директив

  1. proxy_next_upstream: Эта директива указывает Nginx, когда следует пытаться маршрутизировать запрос к следующему серверу в списке. Вы можете настроить её на обработку ошибок, тайм-аутов, недопустимых заголовков и определённых кодов состояния (например, 500). Это обеспечит плавное переключение на рабочий бэкенд в случае сбоя.

  2. proxy_connect_timeout: Установите тайм-аут для подключения к бэкенд-серверу. В нашем случае это значение установлено на 2 секунды. Если соединение не будет установлено за это время, будет выполнена попытка соединения с другим сервером.

  3. proxy_read_timeout: Директива, задающая время ожидания ответа от бэкенд-сервера после успешного подключения.

Заключение

С вышеописанными изменениями в конфигурации Nginx должен корректно обрабатывать ситуации, когда один из бэкенд-серверов выходит из строя. Теперь, при наличии недоступных серверов, Nginx автоматически переключится на другой сервер, предотвращая тайм-ауты и сбои в обслуживании клиентов. Для более детальной информации, вы можете ознакомиться с документацией Nginx.

Настройка такого поведения значительно повысит надежность вашего приложения и улучшит опыт пользователей.

Оцените материал
Добавить комментарий

Капча загружается...