# конспект · шаг 5 из 5
Конспект: stream
stream - другой блок и другие правила: nginx видит байты, а не запросы.
Чего в stream нет
| В http есть | В stream |
|---|---|
location |
нет вовсе, и конфиг с ним не грузится: directive is not allowed here |
| URI, заголовки, методы | нет: $request, $uri, $host не существуют |
proxy_pass http://app/api/ |
только адрес: proxy_pass app:5432 |
add_header, gzip, кеш |
ничего этого нет: тело не разбирается |
stream {
upstream postgres {
server pg-primary:5432;
server pg-standby:5432 backup;
}
server {
listen 5432;
proxy_pass postgres;
}
}
Коды есть, но их видит только лог
$status в stream существует и означает исход сессии; клиенту код передать
некуда, поэтому любой отказ выглядит как оборванное соединение.
$status |
причина | что у клиента |
|---|---|---|
| 200 | сессия прошла | данные бэкенда |
| 403 | deny |
connection reset |
| 503 | limit_conn |
connection reset |
| 502 | бэкенд не отозвался | connection reset |
Есть также $protocol, $session_time, $bytes_sent, $bytes_received,
$upstream_addr, $connection, $server_port.
UDP: длину сессии задаёшь ты
server {
listen 53 udp;
proxy_responses 1;
proxy_timeout 5s;
proxy_pass 10.0.0.53:53;
}
Замер на бэкенде, отвечающем дважды (второй ответ через секунду):
proxy_responses 1 - сессия 0,001 с и второй ответ потерян; proxy_responses 2
- 1,003 с и оба ответа; без директивы - 6,003 с, то есть последний ответ плюс
весь proxy_timeout.
Что помнить
listen 53иlisten 53 udp- разные сокеты: блок сudpне примет TCP-соединение, и наоборот;allow/denyработают, но отказ = закрытое соединение, а не 403;proxy_protocol onшлёт бэкенду строкуPROXY TCP4 172.25.0.4 172.25.0.3 57926 7006перед данными;- виртуальные серверы в stream и директива
passпоявились в 1.25.5 - старое правило «в stream нет server_name» устарело.
Ловушки джокера
access_logв stream по умолчанию выключен. Замер: три stream-сессии дали ноль строк, один http-запрос - одну. «Логов нет» здесь норма, пока не напишешьaccess_logсо своим форматом.- Скопированный из http
log_formatроняет старт:unknown "request" variable. Особенно часто переносятmap $host- переменной$hostв stream нет. - Два блока на одном порту без имени - это предупреждение, а не ошибка.
conflicting server name "" ... ignored, старт проходит, второй блок молча выброшен. proxy_responsesбез нужды режет ответы. Для DNS ответ один, для протокола, отвечающего пачкой, лишнее ограничение теряет данные без записи в логе.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий