<a id="stream-core"></a>

# Потоковый модуль

Базовый потоковый модуль реализует основную функциональность для обработки TCP-
и UDP-соединений: это определение серверных блоков, маршрутизация трафика,
настройка проксирования, поддержка SSL/TLS и управление подключениями для
потоковых сервисов, таких как базы данных, DNS и другие протоколы, работающие на
основе TCP и UDP.

Остальные модули этого раздела расширяют эту функциональность, позволяя гибко
настраивать и оптимизировать работу потокового сервера под различные сценарии и
требования.

При [сборке из исходного кода](https://angie.software//angie/docs/installation/sourcebuild.md#sourcebuild) модуль не собирается по умолчанию; его необходимо
включить с помощью [параметра сборки](https://angie.software//angie/docs/installation/sourcebuild.md#configure)
`‑‑with‑stream`.
В пакетах и образах из
[наших репозиториев](https://angie.software//angie/docs/installation/index.md#install-packages)
модуль включен в сборку.

<a id="configuration-example-55"></a>

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

```nginx
worker_processes auto;

error_log /var/log/angie/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 reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

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

<a id="directives-64"></a>

## Директивы

<a id="index-0"></a>

<a id="s-listen"></a>

### listen

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `listen` адрес[:порт] [`ssl`] [`udp`] [`proxy_protocol`] [`setfib=`число] [`fastopen=`число] [`backlog=`число] [`rcvbuf=`размер] [`sndbuf=`размер] [`accept_filter=`фильтр] [`deferred`] [`bind`] [`ipv6only=``on` | `off`] [`reuseport`] [`so_keepalive=`on|off|[`keepidle`]:[`keepintvl`]:[`keepcnt`]];   |
|------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| По умолчанию                                                                             | —                                                                                                                                                                                                                                                                                                           |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | server                                                                                                                                                                                                                                                                                                      |

Задает адрес и порт для сокета, на котором сервер будет принимать соединения. Можно указать только порт, и тогда Angie будет слушать на всех доступных IPv4-интерфейсах (и IPv6, если он включен). Кроме того, адрес может быть именем хоста, например:

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

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

```nginx
listen [::1]:12345;
listen [::]:12345;
```

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

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

Диапазоны портов задаются при помощи указания первого и последнего порта через дефис:

```nginx
listen 127.0.0.1:12345-12399;
listen 12345-12399;
```

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

| `ssl`            | указывает на то, что все соединения, принимаемые на данном слушающем сокете, должны работать в режиме SSL.                                                                  |
|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `udp`            | конфигурирует слушающий сокет для работы с датаграммами. Для обработки пакетов с одного адреса и порта в рамках одной сессии необходимо также указывать параметр reuseport. |
| `proxy_protocol` | указывает на то, что все соединения, принимаемые на данном порту, должны использовать протокол PROXY.                                                                       |

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

| `setfib=`число         | устанавливает связанную таблицу маршрутизации, FIB (параметр<br/>`SO_SETFIB`) для слушающего сокета. Пока это работает только на<br/>FreeBSD.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `fastopen=`число       | включает "TCP Fast Open" для слушающего сокета и [ограничивает](https://datatracker.ietf.org/doc/html/rfc7413#section-5.1) максимальную длину очереди соединений, которые еще не завершили процесс трехстороннего рукопожатия.<br/><br/>Не включайте "TCP Fast Open", не убедившись, что сервер может адекватно обрабатывать [многократное получение](https://datatracker.ietf.org/doc/html/rfc7413#section-6.1) одного и того же SYN-пакета с данными.                                                                                                                                                                                                                                                     |
| `backlog=`число        | задает параметр backlog в вызове listen(), который ограничивает максимальный размер очереди ожидающих приема соединений. По умолчанию backlog устанавливается равным -1 для FreeBSD, DragonFly BSD и macOS, и 511 для других платформ.                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `rcvbuf=`размер        | задает размер буфера приема (параметр SO_RCVBUF) для слушающего сокета.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `sndbuf=`размер        | задает размер буфера передачи (параметр SO_SNDBUF) для слушающего сокета.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `accept_filter=`фильтр | задает имя принимающего фильтра (параметр `SO_ACCEPTFILTER`) для<br/>слушающего сокета, который фильтрует входящие соединения перед их<br/>передачей в `accept()`. Работает только на FreeBSD и NetBSD 5.0+.<br/>Допустимые значения: `dataready` и `httpready`.                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `deferred`             | указывает использовать отложенный `accept()` (параметр<br/>`TCP_DEFER_ACCEPT`) на Linux.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `bind`                 | указывает, что для данного слушающего сокета нужно делать bind()<br/>отдельно. Это нужно потому, что если описаны несколько директив<br/>`listen` с одинаковым портом, но разными адресами, и одна из<br/>директив `listen` слушает на всех адресах для данного порта<br/>(\*:порт), то Angie сделает bind() только на \*:порт. Необходимо<br/>заметить, что в этом случае для определения адреса, на который пришло<br/>соединение, делается системный вызов getsockname(). Если же<br/>используются параметры setfib, fastopen, backlog, rcvbuf,<br/>sndbuf, accept_filter, deferred, ipv6only, reuseport или<br/>so_keepalive, то для данной пары адрес:порт всегда делается отдельный<br/>вызов bind(). |
| `ipv6only=on` | `off`  | определяет (через параметр сокета `IPV6_V6ONLY`), будет ли слушающий на wildcard-адресе [::] IPv6-сокет принимать только IPv6-соединения, или же одновременно IPv6- и IPv4-соединения. По умолчанию параметр включен. Установить его можно только один раз на старте.                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `reuseport`            | указывает, что нужно создавать отдельный слушающий сокет для каждого рабочего процесса (через параметр сокета SO_REUSEPORT для Linux 3.9+ и DragonFly BSD или SO_REUSEPORT_LB для FreeBSD 12+), позволяя ядру распределять входящие соединения между рабочими процессами. В настоящий момент это работает только на Linux 3.9+, DragonFly BSD и FreeBSD 12+.<br/><br/>#### WARNING<br/>Ненадлежащее использование параметра reuseport<br/>может быть небезопасно.                                                                                                                                                                                                                                           |
| `multipath`            | включает прием соединений по протоколу [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP) (MPTCP),<br/>поддерживаемому в ядре Linux с версии 5.6.<br/>Параметр **несовместим** с `udp`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |

`so_keepalive=on` | `off` | [`keepidle`]:[`keepintvl`]:[`keepcnt`]

Конфигурирует для слушающего сокета поведение "TCP keepalive".

| `''`   | если параметр опущен, для сокета будут действовать настройки операционной системы   |
|--------|-------------------------------------------------------------------------------------|
| `on`   | для сокета включается параметр SO_KEEPALIVE                                         |
| `off`  | для сокета параметр SO_KEEPALIVE выключается                                        |

Некоторые операционные системы поддерживают настройку параметров "TCP keepalive"
на уровне сокета посредством параметров `TCP_KEEPIDLE`, `TCP_KEEPINTVL` и
`TCP_KEEPCNT`. На таких системах их можно сконфигурировать с помощью параметров
`keepidle`, `keepintvl` и `keepcnt`. Один или два параметра могут быть опущены,
в таком случае для соответствующего параметра сокета будут действовать
стандартные системные настройки.

Например,

```nginx
so_keepalive=30m::10
```

установит таймаут бездействия (`TCP_KEEPIDLE`) в 30 минут, для интервала проб (`TCP_KEEPINTVL`) будет действовать стандартная системная настройка, а счетчик проб (`TCP_KEEPCNT`) будет равен 10.

<a id="index-1"></a>

<a id="s-preread-buffer-size"></a>

### preread_buffer_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `preread_buffer_size` размер;   |
|------------------------------------------------------------------------------------------|---------------------------------|
| По умолчанию                                                                             | `preread_buffer_size 16k;`      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server                  |

Задает размер буфера [предварительного чтения](https://angie.software//angie/docs/configuration/processing.md#stream-sessions).

<a id="index-2"></a>

<a id="s-preread-timeout"></a>

### preread_timeout

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `preread_timeout` время;   |
|------------------------------------------------------------------------------------------|----------------------------|
| По умолчанию                                                                             | `preread_timeout 30s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server             |

Задает время фазы [предварительного чтения](https://angie.software//angie/docs/configuration/processing.md#stream-sessions).

<a id="index-3"></a>

<a id="s-proxy-protocol-timeout"></a>

### proxy_protocol_timeout

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `proxy_protocol_timeout` время;   |
|------------------------------------------------------------------------------------------|-----------------------------------|
| По умолчанию                                                                             | `proxy_protocol_timeout 30s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server                    |

Задает время для завершения операции чтения заголовка протокола PROXY. Если по истечении этого времени заголовок полностью не получен, соединение закрывается.

<a id="index-4"></a>

<a id="s-resolver"></a>

### resolver

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `resolver` адрес ... [`valid=`время] [`ipv4=``on` | `off`] [`ipv6=``on` | `off`] [`status_zone=`зона];   |
|------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| По умолчанию                                                                             | —                                                                                                        |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server, upstream                                                                                 |

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

```nginx
resolver 127.0.0.53 [::1]:5353;
```

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

#### NOTE
Рекомендуется использовать локальный доверенный резолвер, например
`127.0.0.53` (systemd-resolved), а не публичный (например, `8.8.8.8`).
Публичные резолверы раскрывают DNS-запросы третьим сторонам и повышают
риск атак с подменой кэша.

#### NOTE
Значение директивы наследуется вложенными блоками
и может быть переопределено в них при необходимости.
В пределах одного блока допустимо указывать директиву только один раз.
Если она повторяется, действует последнее определение.

По умолчанию Angie кэширует ответы, используя значение TTL из ответа DNS. Если
директива `resolver` не указана и не выполняются динамические DNS-запросы
(например, при использовании фиксированных имен в [Proxy](https://angie.software//angie/docs/configuration/modules/stream/stream_proxy.md#stream-proxy) без
переменных), указание резолвера не требуется: имена будут разрешены при запуске
с помощью системного резолвера. Необязательный параметр `valid` позволяет
это переопределить:

| `valid`   |  *необязательный* параметр, позволяет переопределить срок кэширования ответа   |
|-----------|--------------------------------------------------------------------------------|
```nginx
resolver 127.0.0.53 [::1]:5353 valid=30s;
```

По умолчанию Angie будет искать как IPv4-, так и IPv6-адреса при преобразовании имен в адреса.

| `ipv4=off`   | запрещает поиск IPv4-адресов   |
|--------------|--------------------------------|
| `ipv6=off`   | запрещает поиск IPv6-адресов   |

<a id="s-resolver-status"></a>

| `status_zone`   |  *необязательный* параметр;<br/>включает сбор метрик запросов и ответов DNS-сервера<br/>([/status/resolvers/<зона>](https://angie.software//angie/docs/configuration/modules/http/http_api.md#api-status-resolvers))<br/>в указанной зоне   |
|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

<a id="index-5"></a>

<a id="s-resolver-timeout"></a>

### resolver_timeout

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `resolver_timeout` время;   |
|------------------------------------------------------------------------------------------|-----------------------------|
| По умолчанию                                                                             | `resolver_timeout 30s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server, upstream    |

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

```nginx
```

resolver_timeout 5s;

<a id="index-6"></a>

<a id="s-error-log-user-tag"></a>

### error_log_user_tag

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `error_log_user_tag` значение;   |
|------------------------------------------------------------------------------------------|----------------------------------|
| По умолчанию                                                                             | —                                |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server                   |

Добавляет тег, зависящий от сессии, в записи [error_log](https://angie.software//angie/docs/configuration/modules/core.md#error-log). Значение является
[сложным значением](https://angie.software//angie/docs/configuration/configfile.md#syntax) и может содержать переменные. Директива может
задаваться несколько раз для добавления нескольких тегов. Теги используются в
фильтрах `filter=tag:` директивы [error_log](https://angie.software//angie/docs/configuration/modules/core.md#error-log).

<a id="index-7"></a>

<a id="s-server"></a>

### server

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `server` { ... }   |
|------------------------------------------------------------------------------------------|--------------------|
| По умолчанию                                                                             | —                  |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream             |

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

<a id="index-8"></a>

<a id="s-server-name"></a>

### server_name

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `server_name` имя ...;   |
|------------------------------------------------------------------------------------------|--------------------------|
| По умолчанию                                                                             | `server_name "";`        |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | server                   |

Задает имена виртуального сервера.

#### WARNING
В модуле `stream` директива `server_name` основана на Server Name
Indication ([SNI](https://angie.software//angie/docs/configuration/ssl.md#sni)) и работает только с TLS-соединениями. Для
использования необходимо [настроить TLS-терминацию](https://angie.software//angie/docs/configuration/ssl.md#ssl-config) или
[включить TLS preread](https://angie.software//angie/docs/configuration/modules/stream/stream_ssl_preread.md#stream-ssl-preread) в соответствующем блоке
`server`.

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

```nginx
server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate /etc/angie/cert.pem;
    ssl_certificate_key /etc/angie/key.pem;
}
```

Первое указанное имя становится основным именем сервера.

Имена серверов могут включать звездочку (`*`),
заменяющую первую или последнюю часть имени:

```nginx
server {
    server_name example.com *.example.com www.example.*;
}
```

Такие имена называются подстановочными (wildcard).

Также можно использовать регулярные выражения в именах серверов,
предваряя имя тильдой (`~`):

```none
server {
    server_name www.example.com ~^www\d+\.example\.com$;
}
```

Регулярные выражения могут включать захватываемые группы,
которые можно использовать в других директивах:

```nginx
server {
    server_name ~^(www\.)?(.+)$;

    proxy_pass www.$2:12345;
}
```

Именованные захваты в регулярных выражениях создают переменные, которые можно
использовать в других директивах:

```nginx
server {
    server_name ~^(www\.)?(?<domain>.+)$;

    proxy_pass www.$domain:12345;
}
```

Если параметр директивы установлен на `$hostname`, будет вставлено имя
хоста машины.

При поиске виртуального сервера по имени, если имя совпадает с более чем одним
из указанных вариантов (например, совпадают и шаблонное имя, и регулярное
выражение), будет выбрано первое совпавшее имя в следующем порядке приоритета:

- Точное имя
- Самое длинное шаблонное имя, начинающееся с звездочки, например,
  `*.example.com`
- Самое длинное шаблонное имя, заканчивающееся звездочкой, например,
  `mail.*`
- Первое совпавшее регулярное выражение (в порядке появления в конфигурационном
  файле)

<a id="index-9"></a>

<a id="s-server-names-hash-bucket-size"></a>

### server_names_hash_bucket_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `server_names_hash_bucket_size` размер;    |
|------------------------------------------------------------------------------------------|--------------------------------------------|
| По умолчанию                                                                             | `server_names_hash_bucket_size 32|64|128;` |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                                     |

Задает размер корзины для хэш-таблиц имен серверов. Значение по умолчанию
зависит от размера кэш-линии процессора.

<a id="index-10"></a>

<a id="s-server-names-hash-max-size"></a>

### server_names_hash_max_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `server_names_hash_max_size` размер;   |
|------------------------------------------------------------------------------------------|----------------------------------------|
| По умолчанию                                                                             | `server_names_hash_max_size 512;`      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                                 |

Задает максимальный размер хэш-таблиц имен серверов.

<a id="index-11"></a>

<a id="s-status-zone"></a>

### status_zone

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `status_zone` зона | ключ `zone=`зона[:число];   |
|------------------------------------------------------------------------------------------|--------------------------------------------------|
| По умолчанию                                                                             | —                                                |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | server                                           |

Выделяет зону разделяемой памяти для сбора метрик
[/status/stream/server_zones/<зона>](https://angie.software//angie/docs/configuration/modules/http/http_api.md#api-status-stream-server-zones).

Несколько контекстов `server`
могут совместно использовать одну и ту же зону для сбора данных.

Синтаксис с одним значением зоны
объединяет все метрики для текущего контекста в одну зону разделяемой памяти:

```nginx
server {

    listen 80;
    server_name *.example.com;

    status_zone single;
    # ...
}
```

Альтернативный синтаксис позволяет задавать следующие параметры:

| значение               | Строка с переменными, значение которой определяет группировку подключений<br/>в зоне. Все подключения, дающие одинаковые значения после подстановки,<br/>объединяются в одну группу. Если подстановка возвращает пустое значение,<br/>метрики не обновляются.   |
|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| зона                   | Имя зоны разделяемой памяти.                                                                                                                                                                                                                                    |
| число (необязательный) | Максимальное количество отдельных групп для сбора метрик.<br/>Если новые значения ключа превышают этот лимит, они объединяются в группу zone.<br/><br/>Значение по умолчанию — 1.                                                                               |

В следующем примере все соединения с одинаковым значением `$server_addr`
группируются в `host_zone`. Метрики собираются отдельно для каждого
уникального значения `$server_addr` до тех пор, пока количество групп
метрик не достигнет 10. После этого любые новые значения `$server_addr`
будут добавляться в группу `server_zone`:

```nginx
stream {

    upstream backend {
        server 192.168.0.1:3306;
        server 192.168.0.2:3306;
        # ...
    }

    server {

        listen 3306;
        proxy_pass backend;

        status_zone $server_addr zone=server_zone:10;
    }
}
```

Результирующие метрики разделяются по отдельным серверам в выводе API.

<a id="index-12"></a>

<a id="s-stream"></a>

### stream

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `stream` { ... }   |
|------------------------------------------------------------------------------------------|--------------------|
| По умолчанию                                                                             | —                  |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | main               |

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

<a id="index-13"></a>

<a id="s-tcp-nodelay"></a>

### tcp_nodelay

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `tcp_nodelay` `on` | `off`;   |
|------------------------------------------------------------------------------------------|-------------------------------|
| По умолчанию                                                                             | `tcp_nodelay on;`             |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream, server                |

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

<a id="index-14"></a>

<a id="s-variables-hash-bucket-size"></a>

### variables_hash_bucket_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `variables_hash_bucket_size` размер;   |
|------------------------------------------------------------------------------------------|----------------------------------------|
| По умолчанию                                                                             | `variables_hash_bucket_size 64;`       |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                                 |

Задает размер корзины в хэш-таблице переменных. Подробнее настройка хэш-таблиц обсуждается [отдельно](https://angie.software//angie/docs/configuration/configfile.md#configure-hashes).

<a id="index-15"></a>

<a id="s-variables-hash-max-size"></a>

### variables_hash_max_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `variables_hash_max_size` размер;   |
|------------------------------------------------------------------------------------------|-------------------------------------|
| По умолчанию                                                                             | `variables_hash_max_size 1024;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                              |

Задает максимальный размер хэш-таблиц переменных. Подробнее настройка хэш-таблиц обсуждается [отдельно](https://angie.software//angie/docs/configuration/configfile.md#configure-hashes).

<a id="stream-core-variables"></a>

## Встроенные переменные

Базовый потоковый модуль поддерживает встроенные переменные:

<a id="v-s-angie-version"></a>

### `$angie_version`

версия Angie

<a id="v-s-binary-remote-addr"></a>

### `$binary_remote_addr`

адрес клиента в бинарном виде, длина значения всегда 4 байта для IPv4-адресов или 16 байт для IPv6-адресов

<a id="v-s-bytes-received"></a>

### `$bytes_received`

число байт, полученных от клиента

<a id="v-s-bytes-sent"></a>

### `$bytes_sent`

число байт, переданных клиенту

<a id="v-s-connection"></a>

### `$connection`

порядковый номер соединения

<a id="v-s-hostname"></a>

### `$hostname`

имя хоста

<a id="v-s-msec"></a>

### `$msec`

текущее время в секундах с точностью до миллисекунд

<a id="v-s-nginx-version"></a>

### `$nginx_version`

версия nginx

<a id="v-s-pid"></a>

### `$pid`

номер (PID) рабочего процесса

<a id="v-s-protocol"></a>

### `$protocol`

протокол, используемый для работы с клиентом: TCP или UDP

<a id="v-s-proxy-protocol-addr"></a>

### `$proxy_protocol_addr`

адрес клиента, полученный из заголовка протокола PROXY.
Протокол PROXY должен быть предварительно включен при помощи установки параметра proxy_protocol в директиве [listen](#s-listen).

<a id="v-s-proxy-protocol-port"></a>

### `$proxy_protocol_port`

порт клиента, полученный из заголовка протокола PROXY.
Протокол PROXY должен быть предварительно включен при помощи установки параметра proxy_protocol в директиве [listen](#s-listen).

<a id="v-s-proxy-protocol-server-addr"></a>

### `$proxy_protocol_server_addr`

адрес сервера, полученный из заголовка протокола PROXY.
Протокол PROXY должен быть предварительно включен при помощи установки параметра proxy_protocol в директиве [listen](#s-listen).

<a id="v-s-proxy-protocol-server-port"></a>

### `$proxy_protocol_server_port`

порт сервера, полученный из заголовка протокола PROXY.
Протокол PROXY должен быть предварительно включен при помощи установки параметра proxy_protocol в директиве [listen](#s-listen).

<a id="v-s-proxy-protocol-tlv"></a>

### `$proxy_protocol_tlv_<имя>`

TLV, полученный из заголовка протокола PROXY. Имя может быть именем типа TLV или его числовым значением. В последнем случае значение задается в шестнадцатеричном виде и должно начинаться с 0x:

```none
$proxy_protocol_tlv_alpn
$proxy_protocol_tlv_0x01
```

SSL TLV могут также быть доступны как по имени типа TLV, так и по его числовому значению, оба должны начинаться с `ssl_`:

```none
$proxy_protocol_tlv_ssl_version
$proxy_protocol_tlv_ssl_0x21
```

Поддерживаются следующие имена типов TLV:

* `alpn (0x01)` - протокол более высокого уровня, используемый поверх соединения
* `authority (0x02)` - значение имени хоста, передаваемое клиентом
* `unique_id (0x05)` - уникальный идентификатор соединения
* `netns (0x30)` - имя пространства имен
* `ssl (0x20)` - структура SSL TLV в бинарном виде

Поддерживаются следующие имена типов SSL TLV:

* `ssl_version (0x21)` - версия SSL, используемая в клиентском соединении
* `ssl_cn (0x22)` - Common Name сертификата
* `ssl_cipher (0x23)` - имя используемого шифра
* `ssl_sig_alg (0x24)` - алгоритм, используемый для подписи сертификата
* `ssl_key_alg (0x25)` - алгоритм публичного ключа

Также поддерживается следующее специальное имя типа SSL TLV:

* `ssl_verify` - результат проверки клиентского сертификата: 0, если клиент предоставил сертификат и он был успешно верифицирован, либо ненулевое значение

Протокол PROXY должен быть предварительно включен при помощи установки параметра proxy_protocol в директиве [listen](#s-listen).

<a id="v-s-remote-addr"></a>

### `$remote_addr`

адрес клиента

<a id="v-s-remote-port"></a>

### `$remote_port`

порт клиента

<a id="v-s-server-addr"></a>

### `$server_addr`

адрес сервера, принявшего соединение.
Получение значения этой переменной обычно требует одного системного вызова. Чтобы избежать системного вызова, в директивах [listen](#s-listen) следует указывать адреса и использовать параметр `bind`.

<a id="v-s-server-port"></a>

### `$server_port`

порт сервера, принявшего соединение

<a id="v-s-session-time"></a>

### `$session_time`

длительность сессии в секундах с точностью до миллисекунд

<a id="v-s-status"></a>

### `$status`

статус сессии, может принимать одно из следующих значений:

| `200`   | сессия завершена успешно                                                                                                                                                              |
|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `400`   | невозможно разобрать данные, полученные от клиента, например заголовок протокола PROXY                                                                                                |
| `403`   | доступ запрещен, например при ограничении доступа для [определенных адресов клиентов](https://angie.software//angie/docs/configuration/modules/stream/stream_access.md#stream-access) |
| `500`   | внутренняя ошибка сервера                                                                                                                                                             |
| `502`   | плохой шлюз, например если невозможно выбрать сервер группы или сервер недоступен                                                                                                     |
| `503`   | сервис недоступен, например при ограничении по [числу соединений](https://angie.software//angie/docs/configuration/modules/stream/stream_limit_conn.md#stream-limit-conn)             |

<a id="v-s-time-iso8601"></a>

### `$time_iso8601`

локальное время в формате по стандарту ISO 8601

<a id="v-s-time-local"></a>

### `$time_local`

локальное время в Common Log Format
