імена сервера

Імена сервера задаються за допомогою директиви server_name і визначають, в якому блоці server буде оброблятися той чи інший запит. Див. Також "Як nginx обробляє запити". Імена можуть бути задані точно, за допомогою маски або регулярного виразу:

При пошуку віртуального сервера на ім'я, якщо імені відповідає кілька із зазначених варіантів, наприклад, одночасно підходять і ім'я з маскою, і регулярний вираз, буде обраний перший підходящий варіант в такому порядку пріоритету:

  1. точне ім'я
  2. найдовше ім'я з маскою на початку, наприклад "* .example.org"
  3. найдовше ім'я з маскою в кінці, наприклад "mail. *"
  4. першій наявній нагоді регулярний вираз (в порядку проходження в конфігураційному файлі)

Імена з масками

Ім'я з маскою може містити зірочку ( "*") тільки на початку або в кінці імені, і тільки на кордоні, яка визначається точкою. Імена "www. *. Example.org" і "w * .example.org" є некоректними, але їх можна задати за допомогою регулярних виразів, наприклад, "

^ W. * \. Example \ .org $ ". Зірочка може використовуватися декількома частинами імені. Імені з маскою "* .example.org" відповідає не тільки www.example.org. але і www.sub.example.org.

Спеціальне ім'я з маскою виду ".example.org" відповідає як точному імені "example.org", так і масці "* .example.org".

Імена, задані регулярними виразами

Регулярні вирази, які використовуються в nginx, сумісні з використовуваними в мові програмування Perl (PCRE). Ім'я сервера, заданий регулярним виразом, має починатися з символу тильди:

в іншому випадку воно буде розглядатися як точне, або ж, якщо вираз містить зірочку ( "*"), то як ім'я з маскою (і, швидше за все, некоректне). Не забувайте ставити спеціальні символи початку ( "^") і кінця ( "$") рядка. За синтаксису вони не потрібні, але логічно вони можуть бути потрібні. Також зауважте, що всі точки в доменних іменах повинні бути екрановані символом зворотної косої межі. Регулярний вираз, що містить символи " <” и “> ", Необхідно екранувати:

інакше nginx відмовиться запускатися і видасть повідомлення про помилку:

До іменованого виділенню в регулярному виразі можна згодом звернутися через змінну:

Бібліотека PCRE підтримує іменовані виділення, використовуючи наступний синтаксис:

Сумісний з Perl 5.10 синтаксис, підтримується починаючи з PCRE-7.0

Python-сумісний синтаксис, підтримується починаючи з PCRE-4.0

Якщо nginx відмовляється запускатися і видає повідомлення про помилку:

то це означає, що використовується стара версія бібліотеки PCRE і слід замість цього спробувати синтаксис "? P ". Також можна використовувати нумеровані виділення:

Однак таке використання має обмежуватися простими випадками як у прикладі вище, оскільки нумеровані виділення легко можуть бути перезаписані.

Інші імена

Деякі імена мають спеціальне значення.

Якщо необхідно обробляти запити без поля "Host" в заголовку в блоці server. який не є стандартним сервером, слід вказати порожнє ім'я:

Якщо директива server_name не задана в блоці server. то nginx буде використовувати порожнє ім'я в якості імені сервера.

Версії nginx аж до 0.8.48 в цьому випадку використовували ім'я хоста (hostname) машини в якості імені сервера.

Якщо ім'я сервера задано як "$ hostname" (0.9.4), то використовується ім'я хоста (hostname) машини.

У прикладах конфігурації серверів, що обробляють всі запити, зустрічається дивне ім'я "_":

Воно не є якимось особливим, це просто одна з безлічі некоректних доменних імен, які ніколи не перетнуться ні з одним з реальних імен. З тим же успіхом можна використовувати імена типу "-" і "! @ #".

Версії nginx аж до 0.6.25 підтримували спеціальне ім'я "*", яке багатьма невірно сприймалося як ім'я сервера для обробки всіх запитів. Воно ніколи так не працювало, і не працювало як ім'я з маскою. Це ім'я діяло так само, як зараз діє директива server_name_in_redirect. Спеціальне ім'я "*" оголошено застарілим, а замість нього слід використовувати директиву server_name_in_redirect. Зауважте, що за допомогою директиви server_name можна задати ні ім'я сервера для обробки всіх запитів, ні сервер за замовчуванням. Це є властивістю директиви listen. а не server_name. Див. Також "Як nginx обробляє запити". Можна налаштувати сервери, котрі слухають на портах *: 80 і *: 8080, і вказати, що один з них буде сервером за замовчуванням для порту *: 8080, а інший - для порту *: 80:

оптимізація

Точні імена, імена з масками, що починаються зі зірочки, і імена з масками, що закінчуються на зірочку, зберігаються в трьох хеш-таблицях, прив'язаних до слухають портам. Розміри хеш-таблиць оптимізуються на фазі конфігурації таким чином, що ім'я може бути знайдено з мінімальним числом невлучень в кеш процесора. Детальніше настройка хеш-таблиць обговорюється в окремому документі.

В першу чергу ім'я шукається в хеш-таблиці точних імен. Якщо ім'я не було знайдено, то ім'я шукається в хеш-таблиці імен з масками, що починаються зі зірочки. Якщо і там пошук не дав результату, то ім'я шукається в хеш-таблиці імен з масками, що закінчуються на зірочку.

Пошук в хеш-таблиці імен з масками повільніше, ніж пошук в хеш-таблиці точних імен, оскільки імена порівнюються по доменним частинам. Зауважте, що спеціальне ім'я з маскою виду ".example.org" зберігається в хеш-таблиці імен з масками, а не в хеш-таблиці точних імен.

Регулярні вирази перевіряються послідовно, а отже є найповільнішим і погано масштабується методом.

З вищевикладених причин краще використовувати точні імена, де це тільки можливо. Наприклад, якщо до сервера найбільш часто звертаються по іменах example.org і www.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 відмовиться запускатися і видасть повідомлення про помилку:

В цьому випадку слід збільшити значення директиви до наступного ступеня двійки:

Якщо задано велике число імен серверів, то буде видано ще одне повідомлення про помилку:

У такому випадку спочатку слід спробувати встановити server_names_hash_max_size в величину, близьку до числа імен серверів, і тільки якщо це не допоможе або час запуску nginx стане неприйнятно великим, слід спробувати збільшити server_names_hash_bucket_size.

Якщо сервер є єдиним сервером для слухача порту, то 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.

Схожі статті