default_server
Тема дорожной карты · Nginx
Сервер по умолчанию в Nginx — это виртуальный хост, обрабатывающий запросы, когда ни одна директива server_name не совпадает с заголовком Host, отправленным клиентом; он назначается путём добавления параметра default_server к директиве listen: listen 80 default_server;. Каждая установка Nginx неявно имеет сервер по умолчанию: если ни один явно не помечен, первый блок server, совпадающий по адресу и порту, действует как сервер по умолчанию — поэтому с точки зрения безопасности рекомендуется явно определять сервер по умолчанию, возвращающий 444 (закрыть соединение) или 400 для нераспознанных имён хостов. Сервер по умолчанию особенно важен в многоарендных конфигурациях обратного прокси и балансировки нагрузки, где Nginx размещает десятки виртуальных хостов: без защищённого сервера по умолчанию сканеры и боты, обращающиеся по случайным IP, могут непреднамеренно получить контент первого настроенного сайта. Выбор SSL/TLS-сертификата также зависит от сервера по умолчанию: при отсутствии SNI или неизвестном имени хоста Nginx предоставляет сертификат из блока сервера по умолчанию для данного порта. Определение явного, защищённого сервера по умолчанию — базовая мера усиления безопасности Nginx, рекомендуемая для любого продакшен-сервера.
Как это работает
default_server (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; полагание на дефолты путает.
Типичные ошибки
Ловушки default_server: нет default-сервера — первый server в конфиге становится дефолтным (сюрприз); тот же listen-порт без разного server_name (выигрывает только первый); server_name _; как catch-all без понимания, что он матчит всё; if ($http_host = ...) performance + edge cases ("if is evil" — см. официальную wiki).