1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 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 ответ один, для протокола, отвечающего пачкой, лишнее ограничение теряет данные без записи в логе.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.