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