Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
NGINX_STREAM_ERROR Linux / DevOps

Настройка проксирования TCP/UDP трафика в Nginx: модуль Stream

Обновлено: 21.08.2026
  • Необходимость балансировки баз данных (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 nginx

5. Проверка прослушивания портов

ss -tulpn | grep -E "5432|53"
Практический опыт инженера: Для TCP-стримов параметр proxy_timeout по умолчанию равен 10 минутам. Для длительных транзакций баз данных обязательно увеличивайте его до нескольких часов (3h-24h), чтобы Nginx не разрывал активные соединения клиентов.

Частые вопросы (FAQ)

Почему директиву stream нельзя помещать внутрь блока http?

Модуль ngx_stream_core_module работает на транспортном уровне L4 (TCP/UDP), в то время как блок http работает на прикладном уровне L7 (HTTP/HTTPS). Они являются независимыми корневыми контекстами Nginx.

Что означает директива proxy_responses 1 для UDP?

Она сообщает Nginx, сколько ответных UDP-датаграмм ожидать от вышестоящего бэкенда перед закрытием сессии (стандартно 1 ответ на 1 DNS-запрос).