Nginx 不支持在 nginx.conf 中配置定时任务清理日志,必须使用 logrotate(推荐)或 crontab + 脚本实现;logrotate 通过 daily、rotate 30、postrotate kill -USR1 等配置完成自动轮转、压缩与重载,由系统默认 cron 每日触发。

nginx.conf 里不能配置定时任务清理日志。Nginx 本身不支持调度功能,所有日志清理必须交由操作系统层面的工具完成。
推荐用 logrotate(最稳妥)
logrotate 是 Linux 系统标准的日志管理工具,专为这类任务设计,稳定、可控、可审计。
- 创建配置文件,例如 /etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 nginx nginx
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}-
daily:每天轮转一次;rotate 30:只保留最近 30 天的归档;postrotate 中的
kill -USR1会通知 Nginx 重新打开日志文件,避免句柄残留 - 无需手动加 crontab,logrotate 默认由 systemd timer 或 cron 每天触发(路径通常为 /etc/cron.daily/logrotate)
用 crontab + shell 脚本(轻量灵活)
适合已有定制逻辑、或需与其他运维脚本统一调度的场景。
- 写一个清理脚本 clear_nginx_logs.sh:
#!/bin/bash
LOG_DIR="/var/log/nginx"
find "$LOG_DIR" -type f \( -name "access.log*" -o -name "error.log*" -o -name "*.log" \) -mtime +30 -exec rm -f {} \;
nginx -s reload # 确保新日志文件被重建,释放已删文件占用的空间- 赋予执行权限:
chmod +x clear_nginx_logs.sh - 添加到 crontab(每天凌晨 2 点执行):
0 2 * * * /path/to/clear_nginx_logs.sh >> /var/log/nginx/clean.log 2>&1
注意日志路径和权限匹配
实际路径可能因安装方式而异:源码编译常用 /usr/local/nginx/logs/,包管理器安装多为 /var/log/nginx/。确认方法:
- 查运行中的配置:
nginx -t -v或ps aux | grep nginx - 看 access_log 指令所在行:
grep "access_log" /etc/nginx/nginx.conf - 脚本中使用的用户(如 nginx、root)需对日志目录有读写权限,否则
find或rm会静默失败
不建议的做法
以下方式存在明显风险,应避免:
- 在 nginx.conf 里写 Lua 定时器(如 init_worker_by_lua_block + os.time)——依赖 OpenResty、易受 worker 进程生命周期影响、难以调试
- 直接
truncate -s 0 access.log或echo "" > access.log—— 不重载 Nginx 会导致磁盘空间不释放(内核仍持有已删文件句柄) - 仅用
find ... -exec rm却不 reload —— 日志写入位置错乱,新内容可能追加到旧文件末尾或丢失


















