问题出现得很突然,日志倒是留得挺全。CentOS 7.9 上 nginx 的日志按天切割,配了 create 0644 root root,切完之后 nginx 再也写不进新文件,错误日志里是 Permission denied,磁盘上的日志一直是 0 字节。
刚开始盯着「日志目录的属组不对,新文件没有继承到写权限」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。create 指定的属主是 root,工作进程是 nginx 用户,写不进去。还有一种是配置里没写 su 指令,logrotate 以 root 身份创建文件后没做切换。
不容易想到的是,postrotate 里的 reopen 信号没发给 master 进程。
先看切割后的文件属主
ls -l /var/log/nginx/ | head
然后按服务的运行用户创建新文件
sed -i 's#create 0644 root root#create 0644 nginx nginx#' /etc/logrotate.d/nginx
补上 su 指令声明切换用户
sed -i '/^{/a\ su nginx nginx' /etc/logrotate.d/nginx
手动跑一次并确认能写入
logrotate -f /etc/logrotate.d/nginx && ls -l /var/log/nginx/ && systemctl reload nginx
改完先别撤,确认这几项。切割后的 access.log 属主是 nginx,大小随访问量增长,nginx 错误日志里不再出现 Permission denied。
补一句。create 的属主要和进程实际运行用户一致,su 指令是给 logrotate 自己切换身份用的;切割完必须让服务重新打开文件,否则还在写旧 inode。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
