Назад | Перейти на главную страницу

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

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

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 или более символов.

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

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

server_names_hash_bucket_size 64;

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

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

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

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

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

По умолчанию для server_names_hash_bucket_size выбирается в зависимости от размера строки кэша ЦП сервера. В частности, он должен быть как можно меньше, для уменьшения промахов в кэше ЦП, так как server_names необходимо искать по каждому запросу.

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

  • Ваш файл конфигурации находится в кодировке UTF-16 (или другой кодировке) вместо UTF-8, что приводит к появлению нулей перед или после каждого символа в необработанных данных и удвоению его размера. Это может произойти, если вы отредактируете файл в Windows. В этом случае используйте что-нибудь вроде iconv Исправить это.
  • Вы столкнулись с неизвестной ошибкой в ​​nginx.

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

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