1. 1
  2. 2
  3. 3

# конспект · шаг 3 из 3

Конспект: listen и порты

выжимка - её можно унести в заметки

listen отвечает на первый вопрос обработки: какие соединения этот блок вообще видит.

Формы

listen 80;                     # порт 80 на всех адресах (только IPv4!)
listen [::]:80;                # IPv6 - отдельный сокет
listen 127.0.0.1:8080;         # только локальный адрес
listen 443 ssl;                # соединения на этом порту шифрованные
listen 80 default_server;      # этот блок отвечает за «всё остальное»

Что помнить

  • Адрес и порт отбирают кандидатов раньше имени. Не тот порт - блок вообще не участвует в сравнении имён.
  • IPv4 и IPv6 - два разных сокета. listen 80; открывает только IPv4: запрос по IPv6 получает «соединение отклонено», а не 404.
  • ssl - флаг, а не протокол, и относится он к СОКЕТУ: поставил одному блоку - весь порт стал зашифрованным, включая чужие блоки на нём.
  • Параметры сокета задаются один раз. backlog, reuseport, default_server у второго блока дают duplicate listen options.
  • Более точный адрес побеждает. listen 127.0.0.1:80 перехватывает соединения, пришедшие на этот адрес, у listen 80.

Устаревший синтаксис, который до сих пор копируют

listen 443 ssl http2;      # так больше не надо (предупреждение при проверке)

listen 443 ssl;            # правильно с nginx 1.25
http2 on;

Разница не косметическая: старая форма включала HTTP/2 на весь сокет, то есть всем блокам этого порта, а директива http2 - только на свой server-блок.

Ловушки джокера

  • Сайт не открывается по IPv6, хотя «всё настроено»: забыли listen [::]:80.
  • listen 443; без ssl - nginx читает TLS-рукопожатие как обычный HTTP и отвечает открытым текстом, а клиент видит не «400», а ошибку TLS (wrong version number у curl, «запись слишком длинная» в браузере).
  • listen 8443 ssl в одном блоке и listen 8443 в другом - конфиг принимается, но по HTTP порт больше не отвечает: 400 The plain HTTP request was sent to HTTPS port.
  • Два блока с default_server на одном порту - конфиг не пройдёт проверку.

Комментарии

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

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

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