Как настроить ротацию логов nginx на сервере Linux, чтобы они не занимали всё место на диске?
Ротация логов Nginx — важная задача администрирования сервера. Без неё файлы access.log и error.log могут разрастись до нескольких гигабайт и заполнить весь диск. В Linux для этого используется утилита **logrotate**, которая уже входит в большинство дистрибутивов.
## Где находится конфигурация logrotate для Nginx
При установке Nginx через пакетный менеджер (apt, yum) конфигурационный файл logrotate обычно создаётся автоматически по пути `/etc/logrotate.d/nginx`. Если файла нет — создайте его вручную.
## Пример конфигурации /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
## Разбор ключевых директив
— **daily** — ротация выполняется раз в сутки. Можно заменить на `weekly` или `monthly`.
— **rotate 14** — хранить последние 14 архивов логов, более старые удаляются автоматически.
— **compress** — сжимать архивные логи с помощью gzip, что существенно экономит место.
— **delaycompress** — не сжимать самый свежий архив (нужно, если Nginx ещё может писать в него).
— **missingok** — не выдавать ошибку, если лог-файл отсутствует.
— **notifempty** — не ротировать пустые файлы.
— **create 0640 www-data adm** — создать новый пустой лог-файл с указанными правами после ротации.
— **sharedscripts** — выполнить postrotate-скрипт один раз для всех файлов, а не для каждого.
— **postrotate / kill -USR1** — отправить сигнал USR1 процессу Nginx, чтобы он переоткрыл лог-файлы и начал писать в новый файл.
## Как проверить конфигурацию
Чтобы протестировать ротацию без реального выполнения:
bash
logrotate -d /etc/logrotate.d/nginx
Для принудительного запуска ротации:
bash
logrotate -f /etc/logrotate.d/nginx
## Автоматизация через cron
Logrotate запускается автоматически через cron — обычно скрипт `/etc/cron.daily/logrotate`. Убедитесь, что он присутствует и имеет права на выполнение:
bash
ls -la /etc/cron.daily/logrotate
## Дополнительные советы
— Если сервер нагружен, используйте `size 100M` вместо `daily` — ротация будет происходить при достижении файлом заданного размера.
— Для мониторинга свободного места используйте `df -h` и настройте алерты.
— Логи старше нужного периода можно удалять скриптом через `find /var/log/nginx -name ‘*.gz’ -mtime +30 -delete`.
Правильно настроенная ротация гарантирует, что логи Nginx не переполнят диск и при этом останутся доступны для анализа за нужный период.
