Имена серверов
- Имена с подстановочными знаками
- Имена с регулярными выражениями
- Прочие имена
- Интернационализированные имена
- Выбор виртуального сервера
- Оптимизация
- Совместимость
Имена серверов задаются с помощью директивы server_name и определяют, какой блок server будет использоваться для данного запроса. См. также «Как nginx обрабатывает запрос». Имена могут быть точными, содержать подстановочные знаки или быть регулярными выражениями:
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name *.example.org;
...
}
server {
listen 80;
server_name mail.*;
...
}
server {
listen 80;
server_name ~^(?<user>.+)\.example\.net$;
...
}
Поиск выполняется в следующем порядке приоритета и завершается при первом совпадении:
- точное имя
- самое длинное имя с подстановочным знаком в начале, например «
*.example.org» - самое длинное имя с подстановочным знаком в конце, например «
mail.*» - первое совпавшее регулярное выражение (в порядке появления в файле конфигурации)
Имена с подстановочными знаками
Подстановочный знак может находиться только в начале или конце имени и только на границе доменной части. Имена «www.*.example.org» и «w*.example.org» недопустимы. Однако их можно задать с помощью регулярных выражений, например «~^www\..+\.example\.org$» и «~^w.*\.example\.org$». Подстановочный знак может соответствовать нескольким частям имени. Имя «*.example.org» соответствует не только www.example.org, но и www.sub.example.org.
Специальное имя с подстановочными знаками вида «.example.org» можно использовать для соответствия как точному имени «example.org», так и имени с подстановочным знаком «*.example.org».
Имена с регулярными выражениями
Регулярные выражения, используемые nginx, совместимы с регулярными выражениями языка программирования Perl (PCRE). Чтобы использовать регулярное выражение, имя сервера должно начинаться с символа тильды:
server_name ~^www\d+\.example\.net$;
в противном случае оно будет рассматриваться как точное имя или, если выражение содержит звёздочку, как имя с подстановочным знаком (и, скорее всего, как недопустимое). Не забудьте указать якоря «^» и «$». Синтаксически они не обязательны, но логически необходимы. Также обратите внимание, что точки в доменном имени следует экранировать обратной косой чертой. Регулярное выражение, содержащее символы «{» и «}», следует заключать в кавычки:
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
в противном случае nginx не запустится и выведет сообщение об ошибке:
directive "server_name" is not terminated by ";" in ...
Именованный захват регулярного выражения впоследствии можно использовать как переменную:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
Библиотека PCRE поддерживает именованные захваты с помощью следующего синтаксиса:
?<name> | Синтаксис, совместимый с Perl 5.10, поддерживается начиная с PCRE-7.0 |
?'name' | Синтаксис, совместимый с Perl 5.10, поддерживается начиная с PCRE-7.0 |
?P<name> | Синтаксис, совместимый с Python, поддерживается начиная с PCRE-4.0 |
pcre_compile() failed: unrecognized character after (?< in ...
это означает, что библиотека PCRE устарела и вместо этого следует попробовать синтаксис «?P<name>». Захваты также можно использовать в числовом виде:
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
Однако такое использование следует ограничить простыми случаями (например, приведённым выше), поскольку числовые ссылки легко могут быть перезаписаны.
Прочие имена
Некоторые имена серверов обрабатываются особым образом.
Если необходимо обрабатывать запросы без поля заголовка «Host» в блоке server, который не является сервером по умолчанию, следует указать пустое имя:
server {
listen 80;
server_name example.org www.example.org "";
...
}
Если в блоке server не задана директива server_name, nginx использует пустое имя в качестве имени сервера.
В версиях nginx до 0.8.48 в этом случае в качестве имени сервера использовалось имя хоста машины.
Если имя сервера задано как «$hostname» (0.9.4), используется имя хоста машины.
Если кто-либо отправляет запрос, используя IP-адрес вместо имени сервера, поле заголовка запроса «Host» будет содержать IP-адрес, и запрос может обрабатываться с использованием IP-адреса в качестве имени сервера:
server {
listen 80;
server_name example.org
www.example.org
""
192.168.1.1
;
...
}
В примерах серверов для обработки запросов ко всем именам можно встретить странное имя «_»:
server {
listen 80 default_server;
server_name _;
return 444;
}
В этом имени нет ничего особенного: это всего лишь одно из множества недопустимых доменных имён, которые не совпадают ни с одним реальным именем. Можно также использовать другие недопустимые имена, например «--» и «!@#».
В версиях nginx до 0.6.25 поддерживалось специальное имя «*», которое ошибочно трактовалось как имя для обработки запросов ко всем именам. Оно никогда не работало как имя для обработки запросов ко всем именам или как имя сервера с подстановочными знаками. Вместо этого оно предоставляло функциональность, которая теперь реализована директивой server_name_in_redirect. Специальное имя «*» теперь устарело; вместо него следует использовать директиву server_name_in_redirect. Обратите внимание: задать имя для обработки запросов ко всем именам или сервер по умолчанию с помощью директивы server_name невозможно. Это свойство директивы listen, а не директивы server_name. См. также «Как nginx обрабатывает запрос». Можно определить серверы, прослушивающие порты *:80 и *:8080, и указать один из них сервером по умолчанию для порта *:8080, а другой — сервером по умолчанию для порта *:80:
server {
listen 80;
listen 8080 default_server;
server_name example.net;
...
}
server {
listen 80 default_server;
listen 8080;
server_name example.org;
...
}
Интернационализированные имена
Интернационализированные доменные имена (IDN) в директиве server_name следует указывать в ASCII-представлении (Punycode):
server {
listen 80;
server_name xn--e1afmkfd.xn--80akhbyknj4f; # пример.испытание
...
}
Выбор виртуального сервера
Сначала соединение устанавливается в контексте сервера по умолчанию. Затем имя сервера может быть определено на следующих этапах обработки запроса, каждый из которых участвует в выборе конфигурации сервера:
-
во время SSL-рукопожатия, заранее, в соответствии с SNI
-
после обработки строки запроса
-
после обработки поля заголовка
Host -
если имя сервера не было определено после обработки строки запроса или из поля заголовка
Host, nginx использует пустое имя в качестве имени сервера.
На каждом из этих этапов могут применяться разные конфигурации сервера. Поэтому некоторые директивы следует задавать с осторожностью:
- в случае директивы ssl_protocols список протоколов задаётся библиотекой OpenSSL до того, как конфигурация сервера может быть выбрана на основании имени, запрошенного через SNI; поэтому протоколы следует указывать только для сервера по умолчанию;
- директивы client_header_buffer_size и merge_slashes задействуются до чтения строки запроса, поэтому для них используется конфигурация сервера по умолчанию или конфигурация сервера, выбранная с помощью SNI;
- в случае директив ignore_invalid_headers, large_client_header_buffers и underscores_in_headers, участвующих в обработке полей заголовка запроса, также имеет значение, была ли конфигурация сервера обновлена на основании строки запроса или поля заголовка
Host; - ответ об ошибке будет обработан директивой error_page в сервере, который в данный момент обрабатывает запрос.
Оптимизация
Точные имена, имена с подстановочным знаком в начале и имена с подстановочным знаком в конце хранятся в трёх хеш-таблицах, привязанных к прослушиваемым портам. Размеры хеш-таблиц оптимизируются на этапе настройки, чтобы имя можно было найти с минимальным количеством промахов кэша процессора. Подробная информация о настройке хеш-таблиц приведена в отдельном документе.
Сначала выполняется поиск в хеш-таблице точных имён. Если имя не найдено, выполняется поиск в хеш-таблице имён с подстановочным знаком в начале. Если имя и там не найдено, выполняется поиск в хеш-таблице имён с подстановочным знаком в конце.
Поиск в хеш-таблице имён с подстановочными знаками медленнее, чем поиск в хеш-таблице точных имён, поскольку поиск выполняется по частям доменного имени. Обратите внимание, что специальная форма подстановочного знака «.example.org» хранится в хеш-таблице имён с подстановочными знаками, а не в хеш-таблице точных имён.
Регулярные выражения проверяются последовательно, поэтому это самый медленный и плохо масштабируемый метод.
По этим причинам по возможности лучше использовать точные имена. Например, если наиболее часто запрашиваемые имена сервера — example.org и www.example.org, эффективнее определить их явно:
server {
listen 80;
server_name example.org www.example.org *.example.org;
...
}
вместо использования упрощённой формы:
server {
listen 80;
server_name .example.org;
...
}
Если задано большое количество имён серверов или имена серверов необычно длинные, может потребоваться настроить директивы server_names_hash_max_size и server_names_hash_bucket_size на уровне http. Значение директивы server_names_hash_bucket_size по умолчанию может быть равно 32, 64 или другому значению в зависимости от размера строки кэша процессора. Если значение по умолчанию равно 32, а имя сервера задано как «too.long.server.name.example.org», nginx не запустится и выведет сообщение об ошибке:
could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
В этом случае значение директивы следует увеличить до следующей степени двойки:
http {
server_names_hash_bucket_size 64;
...
Если задано большое количество имён серверов, появится другое сообщение об ошибке:
could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32
В таком случае сначала попробуйте задать для server_names_hash_max_size значение, близкое к количеству имён серверов. Увеличивайте server_names_hash_bucket_size только в том случае, если это не помогло или если nginx запускается неприемлемо долго.
Если сервер является единственным сервером для прослушиваемого порта, nginx вообще не будет проверять имена серверов (и не будет создавать хеш-таблицы для этого порта). Однако есть одно исключение. Если имя сервера — регулярное выражение с захватами, nginx должен выполнить выражение, чтобы получить захваты.
Совместимость
- Специальное имя сервера «
$hostname» поддерживается начиная с версии 0.9.4. - Значение имени сервера по умолчанию — пустое имя «» — начиная с версии 0.8.48.
- Именованные захваты в регулярных выражениях для имён серверов поддерживаются начиная с версии 0.8.25.
- Захваты в регулярных выражениях для имён серверов поддерживаются начиная с версии 0.7.40.
- Пустое имя сервера «» поддерживается начиная с версии 0.7.12.
- Подстановочное имя сервера или регулярное выражение можно использовать в качестве первого имени сервера начиная с версии 0.6.25.
- Имена серверов в виде регулярных выражений поддерживаются начиная с версии 0.6.7.
- Форма подстановочного знака
example.*поддерживается начиная с версии 0.6.0. - Специальная форма
.example.orgподдерживается начиная с версии 0.3.18. - Форма подстановочного знака
*.example.orgподдерживается начиная с версии 0.1.13.
| написал Igor Sysoev отредактировал Brian Mercer |
© 2002-2021 Igor Sysoev
© 2011-2026 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/http/server_names.html