server_name
Тема дорожной карты · Nginx
Директива server_name задаёт имена доменов или шаблоны имён хостов, на которые будет отвечать блок server Nginx, позволяя одному экземпляру Nginx размещать несколько веб-сайтов или виртуальных хостов путём маршрутизации запросов к правильному блоку server на основе HTTP-заголовка Host. Директива server_name принимает точные имена хостов (server_name example.com www.example.com), шаблоны с подстановочными знаками (server_name *.example.com) и регулярные выражения с префиксом тильды (server_name ~^www\.(.+)\.com$); точные совпадения оцениваются первыми для наилучшей производительности. Когда ни один server_name не совпадает со входящим заголовком Host, Nginx возвращается к серверу по умолчанию для данного адреса прослушивания и порта — как правило, первому определённому блоку server или явно помеченному параметром default_server в директиве listen. Директива server_name_in_redirect on управляет тем, использует ли Nginx значение server_name во внутренне генерируемых редиректах, что важно для приложений за обратным прокси, которым нужны корректные абсолютные URL. Правильное определение server_name является обязательным условием для валидации SSL/TLS-сертификатов, редиректов с HTTP на HTTPS и маршрутизации на основе виртуальных хостов в любом многодоменном развёртывании Nginx.
Как это работает
server_name (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; полагание на дефолты путает.
Типичные ошибки
Ловушки server_name: нет default-сервера — первый server в конфиге становится дефолтным (сюрприз); тот же listen-порт без разного server_name (выигрывает только первый); server_name _; как catch-all без понимания, что он матчит всё; if ($http_host = ...) performance + edge cases ("if is evil" — см. официальную wiki).