nginx прекращает регистрацию после того, как crontab изменил файл журнала

У меня есть веб-сервер (django ) работает на nginx + gunicorn. nginx записывает свои обычные журналы в:

~/myproject/log/access.log

, а ошибки - в:

~/myproject/log/error.log

, он работает довольно хорошо в течение нескольких месяцев.

Недавно я обнаружил, что мне нужно найти способ автоматически удалять эти журналы, прежде чем они займут все дискового пространства, поэтому я написал сценарий для удаления частей файла, если он превышает x строк, и позволил crontab запускать сценарий каждые 24 часа.

Затем я заметил, что nginx прекращает регистрацию каждый раз, когда crontab выполнил мой скрипт. Я могу восстановить его, перезапустив nginx, но он снова перестанет вести журнал после того, как crontab выполнит свою работу.

Вот мой сценарий:

LOG_PATH="/home/ubuntu/myproject/log/"
MAX_LINE_COUNT="400000"
NOW=$(TZ='Asia/Taipei' date +"%Y-%m-%d %H:%M")

echo "$NOW (GMT+8) start truncate_logs.sh"

for f in "$LOG_PATH"*; do
    line_count=`wc -l < "$f"`
    echo "$f has $line_count lines"

    if [ "$line_count" -gt "$MAX_LINE_COUNT" ]
        then
            lines_to_truncate=$((line_count-MAX_LINE_COUNT))
            sed -i '1,'"$lines_to_truncate"'d' "$f"
            echo "truncated $lines_to_truncate lines"
        else
            echo "pass"
    fi
done

Интересно, обращаются ли nginx и crontab к файлу одновременно, и это нарушает Поведение журнала nginx?

Кроме того, когда nginx перестает записывать журналы в «access.log», он все равно записывает ошибки в «error.log». "Error.log" файл всегда имеет меньшие строки, поэтому мой сценарий никогда не изменял файл. Это одна из причин, по которой я подозреваю, что модификация моего скрипта в "access.log" изменила поведение nginx.

0
задан 25 February 2016 в 10:57
1 ответ

Для этого следует использовать соответствующий скрипт nginx logrotate.

Вот пример:

"/var/log/nginx/*.log" {
        daily
        rotate 7
        size 100M
        dateext
        dateformat -%Y%m%d-%s
        compress
        delaycompress
        missingok
        notifempty
        create 0640 www-data adm
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi \
        endscript
        postrotate
                [ ! -f /run/nginx.pid ] || kill -USR1 `cat /run/nginx.pid`
        endscript
}

Также можно включить lorotation для проверки размера файла каждый час, а не ежедневно.

sudo ln -s /etc/cron.daily/logrotate /etc/cron.hourly/logrotate

Примеры взяты с сервера ubuntu 14.04, но должны быть совместимы с другими *Nix системами.

.
0
ответ дан 5 December 2019 в 10:41

Теги

Похожие вопросы