nginx: could not build server_names_hash
Сообщение «could not build server_names_hash, you should increase server_names_hash_bucket_size» появляется, когда имена серверов не укладываются в таблицу заданного размера. Это не ошибка конфигурации, а настройка, которую нужно поднять под ваш набор доменов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Длинное имя сервера не укладывается в размер ячейки
Размер ячейки задан кратно размеру строки кеша процессора. Одного длинного имени достаточно, чтобы таблица перестала строиться.
-
Много доменов, таблица не вмещает их все
При сотнях имён не хватает не ячейки, а общего размера таблицы. Сообщение тогда указывает на
server_names_hash_max_size.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщение прямо указывает, какую настройку увеличить.
sudo nginx -tСколько имён в итоговой конфигурации.
sudo nginx -T 2>/dev/null | grep -c server_nameРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Размер ячейки задан кратно размеру строки кеша процессора. Одного длинного имени достаточно, чтобы таблица перестала строиться.
- Как проверить
-
Найдите самые длинные имена.
sudo nginx -T 2>/dev/null | grep server_name | tr " " "\n" | awk "{ print length, \$0 }" | sort -rn | head -5
- Как исправить
-
Увеличьте размер ячейки до следующего значения кратного степени двойки — обычно достаточно 128.
sudo sed -i "s/# server_names_hash_bucket_size 64;/server_names_hash_bucket_size 128;/" /etc/nginx/nginx.conf && sudo nginx -t
- Почему происходит
- При сотнях имён не хватает не ячейки, а общего размера таблицы. Сообщение тогда указывает на
server_names_hash_max_size.
- Как проверить
-
Посчитайте число имён.
sudo nginx -T 2>/dev/null | grep -c server_name
- Как исправить
-
Поднимите
server_names_hash_max_sizeдо значения с запасом относительно числа имён.
Пример вывода
Одно длинное имя не укладывается в размер ячейки. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nginx[6210]: nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64
nginx[6210]: nginx: configuration file /etc/nginx/nginx.conf test failed
Связанные ошибки
- nginx: [emerg] unknown directive nginx не запускается: неизвестная директива в конфигурации. Опечатка, не тот контекст или отсутствующий модуль.
- nginx: [emerg] duplicate listen options и conflicting server name nginx не запускается из-за повторных объявлений: duplicate listen options, conflicting server name, duplicate default server.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
Где встречается чаще всего
Источники
- Документация nginx: server_names_hash_bucket_size
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено доменом длиной более 64 символов.