Nginx 本身并不自带日志自动切割功能,所谓“日志切割失败”通常是指:
logrotate 但没生效下面按常见原因 → 现象 → 解决办法来说明。
logrotate 没通知 Nginx 重新打开日志Nginx 打开的是文件描述符,不是文件名
只移动文件 ≠ 让 Nginx 换文件
必须在切割后让 Nginx 重新打开日志:
kill -USR1 `cat /var/run/nginx.pid`
或 logrotate 配置里加:
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
✅ 少了这一步,100% 会“看起来失败”
❌ 没有 daily / size
/var/log/nginx/*.log {
rotate 7
missingok
}
✅ 正确示例
/var/log/nginx/*.log {
daily
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
www-data / nginx 运行ls -l /var/log/nginx
ps aux | grep nginx
确保:
chown -R nginx:nginx /var/log/nginx
copytruncate 但理解错了copytruncate 干了什么✅ Nginx 不建议用 copytruncate
✅ 用 mv + USR1 才是正确的
logrotate -d /etc/logrotate.d/nginx
强制执行一次:
logrotate -f /etc/logrotate.d/nginx
nginx -s reopen
USR1 信号copytruncate如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一种失败。