Postrotate在logrotate完成日志切割、压缩、删除后立即执行,用于安全重载Nginx:先校验配置(nginx -t),再发送HUP信号(nginx -s reload),确保新日志文件被正确打开且不丢失日志。

理解Postrotate的作用时机
Logrotate执行完日志切割、压缩、删除等操作后,会立即运行postrotate段中的命令。这个阶段适合做服务重载——因为旧日志已归档,新日志文件已由Nginx以新路径打开(前提是Nginx配置了access_log和error_log使用绝对路径且未启用reopen),此时发送HUP信号可让Nginx平滑重启worker进程,重新打开日志文件,避免日志丢失或写入失败。
配置Nginx日志路径需明确且稳定
Nginx必须使用固定绝对路径写日志,不能依赖相对路径或变量(如$hostname)。例如:
正确写法:access_log /var/log/nginx/access.log main;error_log /var/log/nginx/error.log warn;
如果日志路径含变量或软链接未解析,Logrotate轮转后Nginx可能继续往已重命名的旧文件写,导致日志“消失”。可通过ls -l /proc/$(cat /run/nginx.pid)/fd/ | grep log确认worker进程实际打开的日志文件路径。
编写可靠的Postrotate重载逻辑
在logrotate配置中(如/etc/logrotate.d/nginx),postrotate段应包含判断与安全重载:
- 先检查Nginx主进程是否存在且响应正常:
if nginx -t &>/dev/null; then - 再用
nginx -s reload触发平滑重载(不中断连接) - 避免直接调用
systemctl reload nginx,因部分发行版该命令可能阻塞或依赖unit状态,而nginx -s reload更轻量、可靠 - 添加简单日志记录便于排错:
echo "$(date): nginx reloaded" >> /var/log/logrotate.nginx.log
完整配置示例
/etc/logrotate.d/nginx内容如下:
/var/log/nginx/*.log {<br>
daily<br>
missingok<br>
rotate 30<br>
compress<br>
delaycompress<br>
notifempty<br>
create 0644 www-data www-data<br>
sharedscripts<br>
postrotate<br>
if [ -f /run/nginx.pid ]; then<br>
nginx -t &>/dev/null && nginx -s reload<br>
fi<br>
endscript<br>
}
注意:sharedscripts确保多个日志文件只执行一次postrotate;nginx -t校验配置语法,防止重载失败导致服务中断。


















