#Что означает и когда возникает ошибка
Нужно отличить неправильный путь, буферизованную запись, отключённый access_log и продолжающуюся запись в старый inode. Выявляйте причину на живом сервере без потери истории посещений и без остановки службы.
#Причины и как их различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| После ротации не переоткрыт файлПроцесс держит старый дескриптор после переименования access.log. | Новый файл пуст, а ротированный продолжает расти или место не освобождается. | Сигнал nginx -s reopen после проверки путей и прав. |
| Нет права записи в новый каталог или файлРотатор создал файл с неподходящим владельцем или каталог стал недоступным. | В error.log есть permission denied, файл не растёт после reopen. | Восстановить владельца и права по штатной схеме, без chmod 777. |
| Изменён действующий access_log или применяется буферизацияЛоги перенесены в другое место, отключены директивой access_log off либо пишутся с buffer/flush. | Записи приходят в другой файл или с заметной задержкой. | Найти путь через nginx -T и параметры buffer/flush. |
#Пошаговая диагностика и исправление
- Подтвердите, что журнал действительно не пополняетсяС контролируемого компьютера откройте публичную страницу сайта с уникальным безопасным параметром
?logcheck=20261102(не вводите личные данные). Затем на сервере по SSH выполнитеsudo nginx -T 2>&1 | grep -n "access_log", чтобы найти действующий путь. Не исходите из того, что он обязательно/var/log/nginx/access.log: в панели хостинга путь может быть у каждого домена своим. - Проверьте размер и время изменения реального файлаНайдя путь, выполните
sudo ls -li /var/log/nginx/access.logиsudo tail -n 20 /var/log/nginx/access.log, заменив путь на свой. Сравните время последней строки и время теста. Если в настройкеaccess_log offилиbuffer=... flush=..., учитывайте это; принудительная правка без понимания нагрузки не нужна. Если журнал пишется в syslog, просматривайте соответствующий приёмник, а не несуществующий файл. - Найдите правила ротации и старый файлПосмотрите конфигурацию logrotate, обычно
/etc/logrotate.d/nginx, и соседние файлыaccess.log.1либо дату ротированного файла. Если новый файл пуст, а старый растёт, вероятно, Nginx не получил сигнал повторного открытия. При наличииlsofможно посмотреть открытые файлы процесса, но результаты зависят от дистрибутива и версии. Не удаляйте ротированные журналы до выяснения, кто их держит. - Повторно откройте журналы штатной командойУбедитесь, что активен нужный экземпляр Nginx, и выполните по SSH
sudo nginx -s reopen. Это штатный сигнал процесса, не перезапуск. Ожидается, что master и worker-процессы перейдут на новые файлы. Если команда пишет, что PID не найден, проверьте фактический путь PID и используемую конфигурацию; не угадывайте PID вручную. - Проверьте права, если reopen не помогПосмотрите сообщения
sudo journalctl -u nginx -n 100 --no-pagerи путь error_log. Если естьPermission denied, проверьтеls -ldкаталога иls -lфайла, владельца/группу процесса Nginx и штатные права после logrotate. Исправляйте только подтверждённую ошибку под контролем администратора; не используйтеchmod 777и не открывайте журнал на запись всем пользователям. - Исправьте конфигурацию ротации с резервной копиейЕсли проблема повторяется каждый день, сохраните копию
/etc/logrotate.d/nginxи проверьте, содержит лиpostrotateштатное повторное открытие логов для вашего варианта службы. Согласуйте действие с системой управления сервером: панель может иметь собственные правила. Для проверки не запускайте logrotate с принудительным флагом на боевом сервере без понимания последствий — он может перезаписать последовательность архивов. - Убедитесь в результате и сохраните архивыПовторите безопасный HTTP-запрос и сравните новую строку в текущем файле. Проверьте отсутствие новых ошибок reopen и убедитесь, что ротированный журнал больше не растёт. Если после редактирования правил появились ошибки, восстановите копию файла logrotate; при необходимости снова выполните
sudo nginx -s reopen. Не удаляйте логи без утверждённого срока хранения. - Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoПо SSH с sudo, сначала выясните активный экземпляр; команда reopen безопасно переоткрывает файлы журналов, не меняя конфигурацию.
sudo nginx -T 2>&1 | grep -n "access_log"sudo nginx -s reopensudo journalctl -u nginx -n 100 --no-pager
#Проверка результата
Успех: после тестового HTTP-запроса новая запись появляется в действующем access.log, ротированный файл не пополняется, ошибок прав и reopen нет.
#Если проблема осталась
Сохраните дату, точный URL без паролей и токенов, код ответа, обезличенные строки error.log и access.log за это время и перечень уже сделанных изменений. Сравните работу при обращении через публичный адрес и через внутренний балансировщик, если он есть. Если причину пока не удалось подтвердить, восстановите исходную конфигурацию из копии и передайте эти сведения администратору или разработчику приложения; не меняйте несколько параметров одновременно.