SystemdDoctor
служба не работает nginx конфигурация частое

nginx: [emerg] unknown directive

Сообщение nginx: [emerg] unknown directive "..." с именем файла и строкой означает, что nginx не понимает директиву. Причины три: опечатка, директива стоит не в том блоке, или нужный модуль не собран в вашей сборке nginx.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Опечатка в имени директивы

    nginx сверяет имена со списком известных и останавливает разбор на первой неизвестной. Сообщение всегда содержит файл и номер строки.

  2. Директива в неподходящем блоке

    Многие директивы допустимы только в определённом контексте: proxy_pass — в location, server_name — в server, worker_processes — на верхнем уровне. Вне своего блока они считаются неизвестными.

  3. Модуль не собран в этой сборке nginx

    Директивы вроде brotli, more_set_headers, geoip2 приходят из сторонних модулей. В обычной сборке их нет, и они выглядят как неизвестные.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Главная команда: имя файла, строка и текст ошибки.

sudo nginx -t

Версия и список модулей сборки — для директив из сторонних модулей.

nginx -V 2>&1 | head -3

Итоговая конфигурация со всеми включёнными файлами.

sudo nginx -T 2>/dev/null | head -40

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Опечатка в имени директивы
Почему происходит
nginx сверяет имена со списком известных и останавливает разбор на первой неизвестной. Сообщение всегда содержит файл и номер строки.
Как проверить
Посмотрите строку, указанную в сообщении.
sudo nginx -t
sudo sed -n "10,14p" /etc/nginx/sites-enabled/app.conf
Как исправить
Исправьте имя директивы. Проверка конфигурации после правки обязательна: она найдёт следующую ошибку, если та есть.
2. Директива в неподходящем блоке
Почему происходит
Многие директивы допустимы только в определённом контексте: proxy_pass — в location, server_name — в server, worker_processes — на верхнем уровне. Вне своего блока они считаются неизвестными.
Как проверить
Посмотрите, в каком блоке находится строка.
sudo nginx -T 2>/dev/null | grep -n -B10 "имя_директивы" | head -20
Как исправить
Перенесите директиву в допустимый контекст. В документации nginx у каждой директивы указан список контекстов.
3. Модуль не собран в этой сборке 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

Связанные ошибки

Где встречается чаще всего

Источники

  • Документация nginx: директивы и контексты документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено опечаткой в proxy_pass на тестовой машине.
    собственная проверка, systemd 255
    сверено 15 сентября 2026