Модуль ngx_stream_core_module

Пример конфигурации
Директивы
     listen
     resolver
     resolver_timeout
     server
     stream
     tcp_nodelay

Модуль ngx_stream_core_module доступен начиная с версии 1.9.0. По умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра --with-stream.

Пример конфигурации

worker_processes auto;

error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

stream {
    upstream backend {
        hash $remote_addr consistent;

        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    upstream dns {
       server 192.168.0.1:53535;
       server dns.example.com:53;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

    server {
        listen 127.0.0.1:53 udp;
        proxy_responses 1;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
}

Директивы

Синтаксис: listen адрес:порт [ssl] [udp] [backlog=число] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Умолчание:
Контекст: server

Задаёт адрес и порт для сокета, на котором сервер будет принимать соединения. Можно указать только порт. Кроме того, адрес может быть именем хоста, например:

listen 127.0.0.1:12345;
listen *:12345;
listen 12345;     # то же, что и *:12345
listen localhost:12345;

IPv6-адреса задаются в квадратных скобках:

listen [::1]:12345;
listen [::]:12345;

UNIX-сокеты задаются префиксом “unix:

listen unix:/var/run/nginx.sock;

Параметр ssl указывает на то, что все соединения, принимаемые на данном порту, должны работать в режиме SSL.

Параметр udp конфигурирует слушающий сокет для работы с датаграммами (1.9.13).

В директиве listen можно также указать несколько дополнительных параметров, специфичных для связанных с сокетами системных вызовов.

backlog=число
задаёт параметр backlog в вызове listen(), который ограничивает максимальный размер очереди ожидающих приёма соединений (1.9.2). По умолчанию backlog устанавливается равным -1 для FreeBSD, DragonFly BSD и Mac OS X, и 511 для других платформ.
bind
параметр указывает, что для данной пары адрес:порт нужно делать bind() отдельно. Это нужно потому, что если описаны несколько директив listen с одинаковым портом, но разными адресами, и одна из директив listen слушает на всех адресах для данного порта (*:порт), то nginx сделает bind() только на *:порт. Необходимо заметить, что в этом случае для определения адреса, на которой пришло соединение, делается системный вызов getsockname(). Если же используются параметры ipv6only или so_keepalive, то для данной пары адрес:порт всегда делается отдельный вызов bind().
ipv6only=on|off
этот параметр определяет (через параметр сокета IPV6_V6ONLY), будет ли слушающий на wildcard-адресе [::] IPv6-сокет принимать только IPv6-соединения, или же одновременно IPv6- и IPv4-соединения. По умолчанию параметр включён. Установить его можно только один раз на старте.
reuseport
этот параметр (1.9.1) указывает, что нужно создавать отдельный слушающий сокет для каждого рабочего процесса (через параметр сокета SO_REUSEPORT), позволяя ядру распределять входящие соединения между рабочими процессами. В настоящий момент это работает только на Linux 3.9+ и DragonFly BSD.
Ненадлежащее использование параметра может иметь последствия в плане безопасности.
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
этот параметр конфигурирует для слушающего сокета поведение “TCP keepalive”. Если этот параметр опущен, то для сокета будут действовать настройки операционной системы. Если он установлен в значение “on”, то для сокета включается параметр SO_KEEPALIVE. Если он установлен в значение “off”, то для сокета параметр SO_KEEPALIVE выключается. Некоторые операционные системы поддерживают настройку параметров “TCP keepalive” на уровне сокета посредством параметров TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT. На таких системах (в настоящий момент это Linux 2.4+, NetBSD 5+ и FreeBSD 9.0-STABLE) их можно сконфигурировать с помощью параметров keepidle, keepintvl и keepcnt. Один или два параметра могут быть опущены, в таком случае для соответствующего параметра сокета будут действовать стандартные системные настройки. Например,
so_keepalive=30m::10
установит таймаут бездействия (TCP_KEEPIDLE) в 30 минут, для интервала проб (TCP_KEEPINTVL) будет действовать стандартная системная настройка, а счётчик проб (TCP_KEEPCNT) будет равен 10.

Разные серверы должны слушать на разных парах адрес:порт.

Синтаксис: resolver адрес ... [valid=время] [ipv6=on|off];
Умолчание:
Контекст: stream, server

Задаёт серверы DNS, используемые для преобразования имён вышестоящих серверов в адреса, например:

resolver 127.0.0.1 [::1]:5353;

Адрес может быть указан в виде доменного имени или IP-адреса, и необязательного порта. Если порт не указан, используется порт 53. Серверы DNS опрашиваются циклически.

По умолчанию nginx будет искать как IPv4-, так и IPv6-адреса при преобразовании имён в адреса. Если поиск IPv6-адресов нежелателен, можно указать параметр ipv6=off.

По умолчанию nginx кэширует ответы, используя значение TTL из ответа. Необязательный параметр valid позволяет это переопределить:

resolver 127.0.0.1 [::1]:5353 valid=30s;

Эта директива доступна как часть коммерческой подписки.

Синтаксис: resolver_timeout время;
Умолчание:
resolver_timeout 30s;
Контекст: stream, server

Задаёт таймаут для преобразования имени в адрес, например:

resolver_timeout 5s;

Эта директива доступна как часть коммерческой подписки.

Синтаксис: server { ... }
Умолчание:
Контекст: stream

Задаёт конфигурацию для сервера.

Синтаксис: stream { ... }
Умолчание:
Контекст: main

Предоставляет контекст конфигурационного файла, в котором указываются директивы stream-сервера.

Синтаксис: tcp_nodelay on | off;
Умолчание:
tcp_nodelay on;
Контекст: stream, server

Эта директива появилась в версии 1.9.4.

Разрешает или запрещает использование параметра TCP_NODELAY. Параметр включается как для клиентского соединения, так и для соединения с проксируемым сервером.