Ошибка nginx directive is not allowed here: директива не в том блоке
Директива написана правильно, но стоит не в том блоке: например, location оказался вне server или proxy_pass — вне location. Перенесите строку в нужный блок.
Содержание 9
Что сделать прямо сейчас
- Откройте файл на строке из сообщения — шаг 1.
- Посмотрите в таблице, где может стоять эта директива, и перенесите её — шаг 2.
- Проверьте и примените настройки — шаг 3.
Все команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.
Что значит это сообщение
2026/10/09 12:00:00 [emerg] 2345#2345: "location" directive is not allowed here in /etc/nginx/sites-enabled/example.com:6is not allowed here — «здесь не разрешена». Настройки nginx вложены друг в друга: блок http содержит блоки server, а server — блоки location. У каждой директивы своё место. Если она оказалась не в том блоке, nginx останавливается.
Файлы сайтов из /etc/nginx/sites-enabled/ nginx подключает внутри блока http — это строка 60 файла /etc/nginx/nginx.conf. Поэтому в файле сайта на верхнем уровне должны стоять блоки server, а остальное — внутри них. Дата, время и номер процесса у вас будут свои. В других сборках nginx та же строка начинается со слов nginx: [emerg].
Так выглядит простой файл сайта — такой же, как в инструкции Как разместить сайт на VPS: nginx с нуля. Каждая строка внутри фигурных скобок кончается точкой с запятой, а у каждой открывающей скобки { есть своя закрывающая }.
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Шаг 1. Откройте файл на строке из сообщения
Если в сообщении путь начинается с /etc/nginx/sites-enabled/, откройте файл с тем же именем в папке /etc/nginx/sites-available/ — там лежит оригинал, а в sites-enabled только ссылка на него. Как это проверить, написано в разделе «Какой файл открывать». Откройте файл из сообщения сразу на нужной строке: число после знака + — номер строки из сообщения, путь — тот, что стоит перед двоеточием.
sudo nano -l +6 /etc/nginx/sites-available/example.comШаг 2. Перенесите директиву в нужный блок
| Директива в кавычках | Где может стоять | Что случилось |
|---|---|---|
location | Внутри server или другого location | location оказался после закрывающей скобки server — пример ниже |
listen, server_name | Только внутри server | Строка стоит вне server или внутри location |
proxy_pass | Внутри location | proxy_pass написан прямо в server — пример ниже |
server | Внутри http — в файле сайта на верхнем уровне | Один блок server вложили в другой |
http | Только в /etc/nginx/nginx.conf | В файл сайта скопировали блок http { … } — пример ниже |
user, worker_processes, events, pid | Только в /etc/nginx/nginx.conf | В файл сайта скопировали начало чужого nginx.conf — удалите эти строки, в nginx.conf они уже есть |
location после закрывающей скобки
server {
listen 80;
server_name example.com;
root /var/www/example.com;
}
location / {
try_files $uri $uri/ =404;
}
}Скобка в строке 5 закрыла блок server раньше времени, и location в строке 6 оказался снаружи. Удалите лишнюю } в строке 5: блок server должна закрывать последняя скобка файла.
proxy_pass прямо в server
server {
listen 80;
server_name example.com;
proxy_pass http://127.0.0.1:3000;
}proxy_pass может стоять только внутри location. Оберните строку в location / { и }:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
}
}Блок http в файле сайта
2026/10/09 12:00:00 [emerg] 2345#2345: "http" directive is not allowed here in /etc/nginx/sites-enabled/example.com:1Файл сайта уже подключается внутри http, а второй блок http внутри первого быть не может. Удалите строку http { в начале и её закрывающую } в конце файла. Оставьте в файле только блоки server целиком, а остальные строки из бывшего блока http удалите: общие настройки в Ubuntu уже есть в /etc/nginx/nginx.conf.
Шаг 3. Проверьте и примените настройки
Сохраните файл: Ctrl+O, Enter, затем Ctrl+X. Проверьте настройки ещё раз командой sudo nginx -t. Когда в ответе будут слова syntax is ok и test is successful, примените их:
sudo systemctl reload nginxЕсли команда ничего не ответила, настройки применены.
Как проверить
sudo nginx -t отвечает syntax is ok и test is successful. Если появилась другая ошибка — например, unexpected "}", — значит, первая исправлена и nginx дочитал файл дальше. Исправьте и её.
Похожие ошибки
| Сообщение | Чем отличается |
|---|---|
| unknown directive | nginx вообще не знает такого слова |
| unexpected "}" | Лишняя закрывающая скобка в конце файла |
| directive … is not terminated by ";" | Забыта точка с запятой перед блоком |
Тексты сообщений на этой странице сверены с исходным кодом nginx 1.24.0 — эта версия стоит в Ubuntu 24.04. В других версиях слова могут немного отличаться.
Источники
- Исходный код nginx 1.24.0: ngx_conf_file.c — как nginx читает файл настроек и тексты ошибок.
- Документация nginx: модуль ngx_http_core_module — где может стоять каждая директива (строка «Контекст»).
- Документация nginx: proxy_pass — контекст proxy_pass.
- Файл nginx.conf из пакета nginx в Ubuntu 24.04 — строка include /etc/nginx/sites-enabled/*.
Сверено 9–10 октября 2026 года.
Что почитать дальше
- Все ошибки nginx.
- Как разместить сайт на VPS: шаг 4 — как выглядит файл сайта.
- 502 Bad Gateway — если после proxy_pass сайт не открывается.
Проверено и обновлено: 10.10.2026