# конспект · шаг 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на одном порту - конфиг не пройдёт проверку.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий