Что такое proxy_pass и зачем использовать несколько серверов?
Директива proxy_pass
в Nginx — ключевой инструмент для перенаправления запросов на backend-серверы. Её использование с несколькими серверами решает критически важные задачи:
- Масштабируемость: Распределение трафика между серверами позволяет выдерживать высокие нагрузки
- Отказоустойчивость: При падении одного сервера трафик автоматически перенаправляется на рабочие ноды
- Геораспределение: Возможность направлять пользователей к ближайшим серверам
- Гибкость: Легкое добавление/удаление серверов без простоя
Настройка proxy_pass с несколькими серверами в Nginx
Основная конфигурация использует блок upstream
:
http { upstream backend { server 192.168.1.10:80; server 192.168.1.11:80; server backend-domain.com:8080; } server { listen 80; location / { proxy_pass http://backend; } } }
Ключевые параметры:
weight
— задает приоритет сервера (по умолчанию 1)max_fails
— количество ошибок для признания сервера недоступнымfail_timeout
— время исключения сервера из ротации при ошибках
Методы балансировки нагрузки
Nginx поддерживает несколько алгоритмов распределения запросов:
- Round Robin (по умолчанию): Циклическое распределение запросов
- Least Connections: Направление на сервер с минимальным числом активных соединений
- IP Hash: Привязка клиента к конкретному серверу по хешу IP
- Weighted Distribution: Ручное назначение весов серверам
Мониторинг здоровья серверов
Для предотвращения перенаправления на нерабочие ноды настройте проверки:
upstream backend { server server1.example.com max_fails=3 fail_timeout=30s; server server2.example.com max_fails=2 fail_timeout=15s; health_check interval=5s; }
Параметры мониторинга:
interval
— частота проверокfails
— количество проваленных проверок для маркировки “unhealthy”passes
— успешные проверки для возврата в ротацию
Продвинутые техники конфигурации
- Использование DNS-имён с
resolver
для динамических окружений - Настройка таймаутов:
proxy_connect_timeout
,proxy_read_timeout
- Кэширование ответов:
proxy_cache_path
- Обработка WebSocket:
proxy_http_version 1.1
,proxy_set_header Upgrade
Часто задаваемые вопросы (FAQ)
В: Как добавить резервный сервер?
О: Используйте параметр backup
:
server backup-server.example.com:80 backup;
В: Почему запросы не распределяются равномерно?
О: Проверьте:
- Настройки
weight
- Работу алгоритма балансировки
- Статус серверов в
nginx -T
В: Как перенаправлять HTTPS трафик?
О: Добавьте в location
:
proxy_ssl_verify off; proxy_set_header X-Forwarded-Proto https;
В: Можно ли использовать переменные в upstream?
О: Да, с версии Nginx 1.17.0:
map $http_host $backend { hostnames; default backend-default; example.com backend-special; }
В: Как ограничить число соединений с backend?
О: Через параметр max_conns
:
server backend1.example.com max_conns=100;