Настройка проксирования TCP/UDP трафика в Nginx: модуль Stream
- Необходимость балансировки баз данных (PostgreSQL, MySQL, Redis) на транспортном уровне L4.
- Ошибка
"stream" directive is not allowed hereпри добавлении настроек вnginx.conf. - Сброс клиентских TCP-сессий при длительном неактивном соединении (Keepalive / idle timeouts).
1. Подключение модуля Stream
Убедитесь, что модуль установлен и загружен в корневом файле /etc/nginx/nginx.conf (вне блока http {}):
load_module modules/ngx_stream_module.so; # Если модуль динамический2. Настройка проксирования TCP (Балансировка PostgreSQL / MySQL)
Добавьте блок stream в /etc/nginx/nginx.conf или создайте /etc/nginx/stream.d/db.conf:
stream {
upstream postgresql_cluster {
least_conn;
server 10.0.1.50:5432 max_fails=3 fail_timeout=10s;
server 10.0.1.51:5432 max_fails=3 fail_timeout=10s;
}
server {
listen 5432;
proxy_pass postgresql_cluster;
proxy_connect_timeout 5s;
proxy_timeout 3h; # Таймаут удержания сессии
}
}3. Настройка балансировки UDP (DNS проксирование)
stream {
upstream dns_backends {
server 1.1.1.1:53;
server 8.8.8.8:53;
}
server {
listen 53 udp;
proxy_pass dns_backends;
proxy_timeout 2s;
proxy_responses 1;
}
}4. Проверка и перезагрузка
nginx -t && systemctl reload nginx5. Проверка прослушивания портов
ss -tulpn | grep -E "5432|53" Частые вопросы (FAQ)
Почему директиву stream нельзя помещать внутрь блока http?
Модуль ngx_stream_core_module работает на транспортном уровне L4 (TCP/UDP), в то время как блок http работает на прикладном уровне L7 (HTTP/HTTPS). Они являются независимыми корневыми контекстами Nginx.
Что означает директива proxy_responses 1 для UDP?
Она сообщает Nginx, сколько ответных UDP-датаграмм ожидать от вышестоящего бэкенда перед закрытием сессии (стандартно 1 ответ на 1 DNS-запрос).