nginx: [emerg] unknown directive
Сообщение nginx: [emerg] unknown directive "..." с именем файла и строкой означает, что nginx не понимает директиву. Причины три: опечатка, директива стоит не в том блоке, или нужный модуль не собран в вашей сборке nginx.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Опечатка в имени директивы
nginx сверяет имена со списком известных и останавливает разбор на первой неизвестной. Сообщение всегда содержит файл и номер строки.
-
Директива в неподходящем блоке
Многие директивы допустимы только в определённом контексте:
proxy_pass— в location,server_name— в server,worker_processes— на верхнем уровне. Вне своего блока они считаются неизвестными. -
Модуль не собран в этой сборке nginx
Директивы вроде
brotli,more_set_headers,geoip2приходят из сторонних модулей. В обычной сборке их нет, и они выглядят как неизвестные.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Главная команда: имя файла, строка и текст ошибки.
sudo nginx -tВерсия и список модулей сборки — для директив из сторонних модулей.
nginx -V 2>&1 | head -3Итоговая конфигурация со всеми включёнными файлами.
sudo nginx -T 2>/dev/null | head -40Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- nginx сверяет имена со списком известных и останавливает разбор на первой неизвестной. Сообщение всегда содержит файл и номер строки.
- Как проверить
-
Посмотрите строку, указанную в сообщении.
sudo nginx -t sudo sed -n "10,14p" /etc/nginx/sites-enabled/app.conf
- Как исправить
- Исправьте имя директивы. Проверка конфигурации после правки обязательна: она найдёт следующую ошибку, если та есть.
- Почему происходит
- Многие директивы допустимы только в определённом контексте:
proxy_pass— в location,server_name— в server,worker_processes— на верхнем уровне. Вне своего блока они считаются неизвестными.
- Как проверить
-
Посмотрите, в каком блоке находится строка.
sudo nginx -T 2>/dev/null | grep -n -B10 "имя_директивы" | head -20
- Как исправить
- Перенесите директиву в допустимый контекст. В документации nginx у каждой директивы указан список контекстов.
- Почему происходит
- Директивы вроде
brotli,more_set_headers,geoip2приходят из сторонних модулей. В обычной сборке их нет, и они выглядят как неизвестные.
- Как проверить
-
Посмотрите, с какими модулями собран nginx.
nginx -V 2>&1 | tr " " "\n" | grep -E "with-|add-module" | head -20
- Как исправить
- Установите сборку с нужным модулем (в Debian это пакеты nginx-extras или nginx-module-*) либо уберите директиву.
Пример вывода
Опечатка в имени директивы останавливает запуск. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× nginx.service - A high performance web server and a reverse proxy server
Process: 9021 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
nginx[9021]: nginx: [emerg] unknown directive "proxy_pas" in /etc/nginx/sites-enabled/app.conf:12
nginx[9021]: nginx: configuration file /etc/nginx/nginx.conf test failed
Связанные ошибки
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- nginx: [emerg] duplicate listen options и conflicting server name nginx не запускается из-за повторных объявлений: duplicate listen options, conflicting server name, duplicate default server.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Service has more than one ExecStart= setting Несколько команд запуска допустимы только при Type=oneshot. Как правильно заменить команду в переопределении.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
Где встречается чаще всего
Источники
- Документация nginx: директивы и контексты
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено опечаткой в proxy_pass на тестовой машине.