logrotate 管理 nginx 日志的核心是发送 usr1 信号让 nginx 重开日志文件,而非简单重命名;配置须放 /etc/logrotate.d/nginx,权限 644,含 daily、dateext、dateyesterday、create、missingok、notifempty、rotate、sharedscripts 及 postrotate 中的 usr1 信号指令,并需手动验证 -d 和 -vf。

Linux 中用 logrotate 管理 Nginx 访问日志,核心不是“切文件”,而是让 Nginx 主动换新日志文件——否则只是改名,写入仍在原文件里,日志会双写或丢失。
配置文件必须放对位置且权限正确
logrotate 只加载 /etc/logrotate.d/ 目录下的文件,每天由 /etc/cron.daily/logrotate 自动执行。所以:
- 配置文件路径只能是
/etc/logrotate.d/nginx(不能加.conf后缀) - 用
sudo tee /etc/logrotate.d/nginx写入,避免权限问题 - 确认权限为
644,属主属组是root:root - 不要改
/etc/logrotate.conf主文件——系统更新可能覆盖它
关键参数一个都不能少
只写 daily 是无效的。真正按天归档需组合使用:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
daily:触发轮转周期 -
dateext:启用日期后缀(否则是access.log.1这种编号) -
dateyesterday:让归档名显示“昨天”日期(如access.log-2026-10-08),语义准确 -
dateformat -%Y-%m-%d:和dateext配套,定义格式 -
create 0644 nginx nginx:轮转后新建日志文件,并设好权限和属主(根据你实际运行 Nginx 的用户调整,常见是www-data或nginx) -
missingok:日志当天不存在也不报错 -
notifempty:空文件不轮转 -
rotate 30:保留最近 30 份归档,超期自动删除
postrotate 必须发 USR1 信号,不能 reload
Nginx 收到 USR1 会原子性地重新打开日志文件句柄,不中断连接、不丢请求。而 systemctl reload 或 nginx -s reload 会平滑重启 worker 进程,有风险且不必要。
- 必须加
sharedscripts:确保多个日志(如access.log和error.log)只触发一次信号 - 推荐写法:
if [ -f /var/run/nginx.pid ]; then kill -USR1 $(cat /var/run/nginx.pid); fi - 更健壮写法(适配不同安装路径):
pidfile=$(nginx -t 2>&1 | grep "pid" | awk '{print $NF}'); [ -f "$pidfile" ] && kill -USR1 $(cat "$pidfile")
手动验证后再等 cron 自动跑
别等凌晨才发现配置失败。上线前必须做两步验证:
- 用
logrotate -d /etc/logrotate.d/nginx查看模拟执行流程,检查路径是否匹配、PID 文件能否读取、权限是否正常 - 再用
logrotate -vf /etc/logrotate.d/nginx强制执行一次,观察是否生成带日期的归档文件、新日志是否可写、旧日志是否停止追加
确认无误后,它就会每天自动工作了。










