could not build server_names_hash, you should increase server_names_hash_bucket_size: 64

Maxim Dounin mdounin на mdounin.ru
Вс Май 10 17:29:33 UTC 2020


Hello!

On Thu, May 07, 2020 at 05:50:55PM +0300, Gena Makhomed wrote:

> Здравствуйте, All!
> 
> nginx version: nginx/1.17.10 из официального репозитория.
> 
> Почему nginx время от времени ни с того ни с сего глючит при релоаде
> конфигурации и остается работать со старой конфигурацией
> при добавлении нового хоста в конфиг?
> 
> Уже в который раз наступаю на эти грабли.
> 
> При выполнении команды nginx -t он выдает такие ошибки:
> 
> nginx: [warn] could not build optimal server_names_hash, you should increase
> either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 64;
> ignoring server_names_hash_bucket_size

Этот warning означает, что построить оптимальный хэш в рамках 
заданных параметров не удалось, поэтому хэш будет построен без 
учёта server_names_hash_bucket_size.  Возможно, результирующий хэш 
будет не оптимален, поэтому - warning.

> nginx: [emerg] could not build server_names_hash, you should increase
> server_names_hash_bucket_size: 64

А это ошибка означает, что в хэш попытались положить элемент 
длиннее заданного server_names_hash_bucket_size, что выглядит как 
ошибка в конфигурации.  Если это не ошибка, и вы действительно 
хотили такое положить в хэш - это можно сделать, явно увеличив 
server_names_hash_bucket_size.

> nginx: configuration file /etc/nginx/nginx.conf test failed
> 
> или такие:
> 
> nginx: [emerg] could not build server_names_hash, you should increase
> server_names_hash_bucket_size: 64
> nginx: configuration file /etc/nginx/nginx.conf test failed
> 
> и т.п.
> 
> Почему нельзя его научить самостоятельно подбирать нужные ему размеры?
> 
> Например, так:
> 
>   server_names_hash_max_size auto;
>   server_names_hash_bucket_size auto;
> 
> и забыть про эти глюки как про страшный сон?
> 
> Документацию http://nginx.org/ru/docs/hash.html читал,
> но так и не понял, почему nginx не может это делать самостоятельно,
> пусть даже ценой некоторой небольшой задержки пре релоаде конфигурации.
> 
> Небольшая задержка при релоаде конфигурации имхо - это гораздо лучше,
> чем выдавать ошибку и в случайные и непредсказуемые моменты времени
> полностью игнорировать добавление нового хоста в конфиг.

Проблем тут две:

- "Небольшая задержка" - это, скажем так, оптимистичный взгляд на 
  проблему.  Скажем, один перебор всех возможных значений 
  количества bucket'ов - то есть, фактически, построение хэша с 
  большим значением server_names_hash_max_size - может легко 
  занимать минуты процессорного времени. 

- Нет априорного ответа на вопрос "а что оптимальнее: сделать 
  больше bucket'ов или поднять размер одного bucket'а".

Поэтому сейчас всё работает так, что в отсутствии явных ошибок 
конфигурации (как в случае выше - имён в конфиге, превышающих по 
длине заданный размер bucket_size) - хэш всегда строится, а 
информация о его возможной неоптимальности пишется в лог.  Если же 
в конфиге есть явные ошибки - то о них явно же и сообщается.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru