nginx reload не применяет изменения
Если systemctl reload nginx проходит без ошибок, а поведение не меняется, почти всегда правили файл, который не участвует в итоговой конфигурации. Проверяется это одной командой: nginx -T печатает всё, что реально применено.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Файл не включён в конфигурацию
Файл лежит в sites-available без ссылки в sites-enabled, или каталог не подключён через include. Правка есть, а nginx её не видит.
-
Запрос обслуживает другой блок server
При совпадении имён или при отсутствии подходящего блока nginx выбирает блок по умолчанию. Правка в «вашем» блоке при этом не действует.
-
Ответ отдаётся из кеша
При настроенном кеше nginx может отдавать сохранённый ответ, не обращаясь к приложению. Изменения в приложении при этом не видны.
-
Старые рабочие процессы дорабатывают соединения
При мягкой перезагрузке прежние процессы остаются, пока не закроют текущие соединения. Долгие соединения (websocket, загрузки) продлевают это состояние.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Итоговая конфигурация: единственный надёжный ответ на вопрос «что применено».
sudo nginx -T 2>/dev/null | head -40Время запуска процессов: видно, заменились ли рабочие процессы.
ps -o pid,lstart,cmd -C nginxЧем именно выполняется перезагрузка настроек.
systemctl show nginx -p ExecReloadРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Файл лежит в sites-available без ссылки в sites-enabled, или каталог не подключён через include. Правка есть, а nginx её не видит.
- Как проверить
-
Поищите свою правку в итоговой конфигурации.
sudo nginx -T 2>/dev/null | grep -n "ваша_директива"
- Как исправить
-
Включите файл ссылкой или добавьте нужный include, затем перезагрузите настройки.
sudo ln -s /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl reload nginx
- Почему происходит
- При совпадении имён или при отсутствии подходящего блока nginx выбирает блок по умолчанию. Правка в «вашем» блоке при этом не действует.
- Как проверить
-
Посмотрите, какой блок отвечает на запрос.
curl -sI -H "Host: example.org" http://127.0.0.1/ | head -5 sudo nginx -T 2>/dev/null | grep -n "server_name" | head
- Как исправить
-
Уберите конфликт имён или задайте
default_serverтам, где он действительно нужен.
- Почему происходит
- При настроенном кеше nginx может отдавать сохранённый ответ, не обращаясь к приложению. Изменения в приложении при этом не видны.
- Как проверить
-
Посмотрите настройки кеша и заголовки ответа.
sudo nginx -T 2>/dev/null | grep -E "proxy_cache|fastcgi_cache" curl -sI http://127.0.0.1/ | grep -i cache
- Как исправить
- Очистите кеш или проверьте с обходом кеша. Настройку кеширования стоит помнить при любой отладке.
- Почему происходит
- При мягкой перезагрузке прежние процессы остаются, пока не закроют текущие соединения. Долгие соединения (websocket, загрузки) продлевают это состояние.
- Как проверить
-
Посмотрите процессы nginx и время их запуска.
ps -o pid,lstart,cmd -C nginx
- Как исправить
- Дождитесь завершения или, если это допустимо, перезапустите службу полностью.
Пример вывода
Правка в файле, который не включён в конфигурацию. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl reload nginx
$ sudo nginx -T 2>/dev/null | grep -c "client_max_body_size 50m"
0
$ ls -l /etc/nginx/sites-enabled/
lrwxrwxrwx 1 root root 34 Sep 10 11:20 default -> /etc/nginx/sites-available/default
Файл с правкой не включён: в sites-enabled только default. Команда nginx -T показывает это сразу.
Связанные ошибки
- Warning: The unit file … changed on disk Предупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- nginx: [emerg] duplicate listen options и conflicting server name nginx не запускается из-за повторных объявлений: duplicate listen options, conflicting server name, duplicate default server.
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- nginx: [emerg] unknown directive 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)
Воспроизведено правкой файла без ссылки в sites-enabled.