server блок

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

Блок server в Nginx — это единица конфигурации, определяющая, как веб-сервер обрабатывает запросы для конкретного домена, IP-адреса или порта; концептуально он эквивалентен директиве VirtualHost в Apache. Каждый блок server заключён в server { } внутри контекста http и как минимум содержит директивы listen (указывающую порт, например listen 80 или listen 443 ssl) и server_name (указывающую имя хоста или имена хостов, которые он обслуживает). Nginx выбирает, какой блок server обработает входящий запрос, сначала сопоставляя адрес прослушивания и порт, а затем сравнивая заголовок Host с шаблонами server_name — точные совпадения имеют приоритет над шаблонными и регулярными выражениями. Внутри блока server блоки location дополнительно уточняют обработку конкретных URL-путей, позволяя одному экземпляру Nginx одновременно работать как обратный прокси для API-маршрутов, сервер статических файлов для ресурсов и точка SSL/TLS-терминации. Понимание того, как Nginx оценивает блоки server и правила приоритета сопоставления server_name, — фундаментальные знания для размещения нескольких виртуальных хостов или доменов на одном экземпляре Nginx.

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

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; полагание на дефолты путает.

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

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

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

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