Nginx日志平滑切割通过Master进程响应USR1信号实现,不中断服务且不丢失日志;核心步骤为重命名旧日志、发送USR1信号触发reopen、验证后归档;推荐用logrotate自动化管理并注意权限、pid路径及执行顺序。
通过 Nginx Master 进程实现日志平滑切割与物理归档,核心是利用 USR1 信号触发日志文件句柄的重新打开,整个过程不中断服务、不丢失请求日志。这不是 Nginx 自身的轮转功能,而是靠外部操作配合 Master 进程的信号响应机制完成的。
Master 进程收到 SIGUSR1(即 nginx -s reopen 或 kill -USR1 <pid>)后会:
access_log 和 error_log 的路径定义按顺序执行以下三步,确保原子性与安全性:
mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%F-%H)
nginx -s reopen,或kill -USR1 $(cat /var/run/nginx.pid),或kill -USR1 $(pgrep -f "nginx: master")
access.log 是否已生成且有新写入(如 curl 访问后查看文件大小变化),再对归档文件做压缩、同步或上传等后续处理手动操作适合调试或低频场景;高可用系统应交由 logrotate 托管,它能精准控制周期、保留策略和权限。典型配置(/etc/logrotate.d/nginx)如下:
/var/log/nginx/*.log { daily —— 每天凌晨触发 missingok —— 日志不存在也不报错 rotate 30 —— 最多保留 30 份 compress —— 压缩旧文件(.gz) delaycompress —— 延迟压缩,确保当日日志不被立即压缩 create 0644 www-data adm —— 新日志权限与属主 sharedscripts —— 所有匹配文件共用一次 postrotate postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 $(cat /var/run/nginx.pid) fi endscript
}避免常见失误,保障切割可靠:
nginx.pid 路径与配置中 pid 指令一致(默认 /var/run/nginx.pid),否则 kill 找不到进程reopen 之前完成;若先 reopen,Nginx 会继续往原名文件写,导致归档内容不全logrotate 需运行在宿主机或特权容器中,并能访问 Nginx 进程与 pid 文件