listen и порты

Тема дорожной карты · Nginx

Директива listen в Nginx задаёт IP-адрес и порт, на которых блок сервера принимает входящие соединения, и является одной из наиболее фундаментальных директив в любой конфигурации веб-сервера или обратного прокси Nginx. Минимальная запись listen 80; привязывается ко всем интерфейсам на порту 80 для HTTP-трафика, тогда как listen 443 ssl; включает SSL/TLS на порту 443 и требует наличия директив ssl_certificate и ssl_certificate_key в том же блоке server. Директива listen поддерживает IPv6 через listen [::]:80;, может быть ограничена конкретным интерфейсом через listen 192.168.1.1:80; и принимает параметр default_server для обозначения резервного виртуального хоста при несовпадающих заголовках Host. Добавление http2 к директиве listenlisten 443 ssl http2; (Nginx < 1.25) или глобальное включение через http2 on; (Nginx ≥ 1.25) — активирует мультиплексирование HTTP/2 для повышения производительности по SSL/TLS-соединениям. Понимание параметров директивы listen необходимо для корректной настройки многодоменного виртуального хостинга, балансировки нагрузки на нестандартных портах и защиты развёртывания Nginx с помощью HTTPS.

Как это работает

listen и порты (server-блоки в терминологии nginx) позволяют одному nginx обслуживать много хостнеймов + сайтов. server { listen 80; server_name app.example.com; ... }; server_name матчится с Host:-заголовком; default-сервер обрабатывает несовпавшие хостнеймы. Wildcard (*.example.com) или regex (~^(?<sub>.+)\.example\.com$). HTTPS: listen 443 ssl http2 + ssl_certificate + ssl_certificate_key. Default-сервер критичен для безопасности (отвергайте неизвестные хостнеймы).

Когда применять

Всегда определяйте default-сервер, возвращающий 444 (или 421) для несовпавших хостнеймов — предотвращает Host-header инъекции / SSRF-зондирование. Один server-блок на файл в /etc/nginx/conf.d/. if ($host = "example.com") — осторожно (if в nginx имеет edge cases — предпочитайте отдельные server-блоки). Всегда явно listen; полагание на дефолты путает.

Типичные ошибки

Ловушки listen и порты: нет default-сервера — первый server в конфиге становится дефолтным (сюрприз); тот же listen-порт без разного server_name (выигрывает только первый); server_name _; как catch-all без понимания, что он матчит всё; if ($http_host = ...) performance + edge cases ("if is evil" — см. официальную wiki).

Связанные понятия

Полезные ресурсы