tech.zntr

Ротация логов nginx без потери строк

Nginx держит файл лога открытым. Если logrotate просто переименует access.log, nginx продолжит писать в переименованный файл, а новый так и останется пустым.

Чтобы nginx переоткрыл логи, ему нужно отправить сигнал USR1. Перезапуск для этого не нужен, соединения не рвутся.

Конфигурация

Файл /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
    endscript
}

delaycompress оставляет вчерашний лог несжатым: nginx может дописать в него последние строки, пока обрабатывает сигнал.

Проверка

logrotate -d /etc/logrotate.d/nginx
logrotate -f /etc/logrotate.d/nginx
ls -l /var/log/nginx/

После принудительного запуска новый access.log должен начать расти сразу, а не после перезапуска сервиса.