Чому для директиви nginx server_name максимальна довжина має 14 символів?


13

У мене є наступний віртуальний хост

server
{
  server_name abc.example.com;
  root /var/www/test/;
  index index.html;
}

Під час запуску nginx -s reloadя отримую таку помилку:

nginx: [emerg] не вдалося створити ім’я_сервера_гаш, слід збільшити сервер_імена_hash_bucket_size: 32

Те саме відбувається з будь-яким ім'ям сервера, що містить 15 і більше символів.

Якщо я встановив ім’я_сервера ab.example.com(або будь-яке ім'я під 15 символів), проблема перестане проявлятися.

Щоб виправити це, я додав таке /etc/nginx/nginx.conf(раніше не було визначено):

server_names_hash_bucket_size 64;

Якщо встановити його на 33, також працювало, але не 32.

Чому для імені сервера максимальна довжина за замовчуванням становить 14 символів?

Чи обмеження встановлено типовими налаштуваннями nginx або системою, на якій він працює?

Як ім’я_сервера_15 впливає на максимальний розмір хеш-відра? (у системі визначено лише 4 віртуальних хости)


Який зміст grep "" /sys/devices/system/cpu/cpu?/cache/index?/coherency_line_size?
Ксав'є Лукас

@XavierLucas:/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size:64
Virgiliu

Відповіді:


11

Ця помилка виникає , коли server_nameє занадто великою , щоб поміститися в хеш відро .

За замовчуванням для параметра server_names_hash_bucket_sizeвибирається залежно від розміру рядка кешу CPU на сервері. Зокрема, це має бути якомога меншим, щоб зменшити помилки кешу процесора , оскільки server_names потрібно шукати під час кожного запиту.

Щодо того, чому ви обмежені 14 символами замість очікуваного 31, я підозрюю одну з двох можливостей:

  • Ваш конфігураційний файл має кодування UTF-16 (або якесь інше кодування) замість UTF-8, що призводить до появи нулів до або після кожного символу в необроблених даних та подвоєння його розміру. Це може статися, якщо ви редагуєте файл у Windows. Якщо це так, використовуйте щось на зразок, iconvщоб виправити це.
  • Ви зіткнулися з невідомою помилкою в nginx.

Vim каже, що fileencoding = utf-8. Я зробив перетворення за допомогою iconv, щоб переконатися, що кодування UTF8, але нічого не змінилося в поведінці nginx. Можливо, мій VPS має процесор з дуже невеликим розміром кеш-лінії, чи є який-небудь спосіб перевірити його, і що було б для нього розумним значенням?
Віргіліу

Доцільне значення - це найменша потужність двох, з якої nginx успішно запуститься. Якщо у вас є VPS, він може робити майже все, що завгодно ...
Майкл Хемптон

6

Довжина за замовчуванням повинна автоматично визначатися під час запуску, залежно від використовуваних імен серверів, але це також повинно бути оновлено під час reloadоперації. Перевірте, чи працює вона без встановлення розміру відра вручну, але з перезапуском замість перезавантаження.

Див. Http://nginx.org/en/docs/hash.html, щоб дізнатися, як визначаються розміри хешу, та http://nginx.org/en/docs/http/server_names.html, щоб прочитати про хеші, які використовуються для імен серверів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.