Nginx 不支持在 nginx.conf 中配置定时任务清理日志,必须借助 logrotate 或 crontab 等系统级工具实现;logrotate 是推荐方案,支持轮转、压缩、保留天数及平滑重开日志;crontab 配合 Shell 脚本为轻量替代方案;直接在 nginx.conf 中添加定时逻辑均属错误做法。

Nginx 本身不支持在 nginx.conf 中配置定时任务来执行日志清理。nginx.conf 是 Nginx 的运行时配置文件,用于定义服务监听、路由、缓存、日志格式、反向代理等行为,它不具备调度或执行系统级脚本的能力。
定时清理日志属于操作系统层面的运维任务,必须借助 Linux 的 cron 定时服务 或日志管理工具(如 logrotate),而不是写进 nginx.conf。
✅ 正确做法:用外部机制实现定时清理
1. 使用 logrotate(推荐,更专业可靠)
logrotate 是 Linux 系统标准的日志轮转工具,支持自动切割、压缩、保留天数、触发重载等。
示例配置(/etc/logrotate.d/nginx):
/usr/local/nginx-1.20.1/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 nobody nobody
sharedscripts
postrotate
if [ -f /usr/local/nginx-1.20.1/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx-1.20.1/logs/nginx.pid`
fi
endscript
}-
daily:每天轮转 -
rotate 30:只保留最近 30 个归档 -
postrotate ... kill -USR1:通知 Nginx 重新打开日志文件(避免重启)
⚠️ 注意:确保
nginx.pid路径与你实际配置一致;kill -USR1是 Nginx 支持的平滑重开日志信号。
2. 使用 crontab + Shell 脚本(轻量灵活)
若不想用 logrotate,可自建脚本配合 crontab:
-
编写清理脚本
clear_nginx_logs.sh:#!/bin/bash LOG_DIR="/usr/local/nginx-1.20.1/logs" find "$LOG_DIR" -type f \( -name "*.log" -o -name "*.gz" \) -mtime +30 -exec rm -f {} \; echo "Cleaned old logs at $(date)" >> /var/log/nginx/clean.log -
赋予执行权限:
chmod +x /path/to/clear_nginx_logs.sh
-
添加定时任务(每天凌晨 0 点执行):
crontab -e # 添加这一行: 0 0 * * * /path/to/clear_nginx_logs.sh
3. ❌ 不可行的方式(常见误解)
- 在
nginx.conf里写cron { ... }或schedule clean ...→ 语法错误,Nginx 启动会失败 - 试图用
ngx_http_stub_status_module或lua-nginx-module实现定时清理 → 过度复杂、不可靠、违背职责分离原则 - 把
rm命令直接写进nginx.conf的access_log指令中 → 配置无效且危险
小贴士:验证是否生效
- 查看
logrotate是否运行:sudo logrotate -d /etc/logrotate.conf(调试模式) - 查看 cron 日志:
sudo tail -f /var/log/syslog | grep CRON(Debian/Ubuntu)或/var/log/cron(CentOS/RHEL) - 手动测试脚本:
bash -x /path/to/clear_nginx_logs.sh
不复杂但容易忽略。


















