Почему 14 символов является максимальной длиной для директивы nginx server_name?

13

У меня есть следующий виртуальный хост

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

При запуске nginx -s reloadя получаю следующую ошибку:

nginx: [emerg] не смог собрать server_names_hash, вам нужно увеличить server_names_hash_bucket_size: 32

То же самое происходит для любого server_name, которое имеет 15 или более символов.

Если я установлю имя_сервера ab.example.com(или любое имя длиной менее 15 символов), проблема перестанет проявляться.

Чтобы исправить это, я добавил следующее /etc/nginx/nginx.conf(это не было определено ранее):

server_names_hash_bucket_size 64;

Установка его на 33 работала также, но не 32.

Почему максимальная длина по умолчанию составляет 14 символов для имени_сервера?

Это ограничение накладывается настройками по умолчанию nginx или системой, в которой он работает?

Как имя_сервера 15 влияет на максимальный размер хеш-памяти? (в системе определено только 4 виртуальных хоста)

Virgiliu
источник
Каково содержание 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
Вирджилиу

Ответы:

11

Эта ошибка возникает, когда server_nameона слишком велика, чтобы поместиться в корзину хэшей .

Значение по умолчанию для server_names_hash_bucket_sizeвыбирается в зависимости от размера строки кэша ЦП сервера. В частности, он должен быть настолько малым, насколько это возможно, чтобы уменьшить количество кеш-памяти процессора , так как 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, чтобы прочитать о хешах, используемых для имен серверов.

Свен
источник