nginx二进制安装需依赖logrotate实现日志按天轮转,推荐配置logrotate+kill -usr1信号重载,确保权限匹配worker用户、sharedscripts避免重复信号,并由系统cron自动执行。

Nginx 二进制安装(即非包管理器安装,如 ./configure && make && make install)本身不自带日志轮转功能,需依赖系统工具实现按天自动切割。最稳妥、生产环境广泛采用的方式是 logrotate + nginx 重载,无需修改 Nginx 源码或重启服务,也规避了 if/map 动态路径带来的文件句柄和性能隐患。
以下为适配二进制安装的完整配置要点:
确认 logrotate 已就绪
大多数 Linux 发行版(CentOS/RHEL/Ubuntu/Debian)默认已预装 logrotate。验证命令:
logrotate --version
若未安装,按系统执行:
- CentOS/RHEL:
sudo yum install -y logrotate - Ubuntu/Debian:
sudo apt-get install -y logrotate
明确 Nginx 日志路径
二进制安装通常将日志放在:
-
/usr/local/nginx/logs/access.log -
/usr/local/nginx/logs/error.log
请根据你实际nginx.conf中access_log和error_log指令的路径确认(例如logs/是相对路径,实际位于$prefix/logs/,$prefix默认为/usr/local/nginx)。
创建专用 logrotate 配置
新建文件 /etc/logrotate.d/nginx-binary(名称任意,但建议体现部署方式):
/usr/local/nginx/logs/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
dateext
dateformat -%Y%m%d
create 0644 nobody nobody
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
fi
endscript
}
关键说明:
-
create 0644 nobody nobody:按二进制安装常用用户(如nobody或www-data)设置新日志权限,务必与 nginx worker 进程运行用户一致(查ps aux | grep nginx确认); -
kill -USR1:向 master 进程发送信号,触发日志 reopen(等效于nginx -s reopen),比systemctl reload更轻量可靠,因二进制安装通常无 systemd unit 文件; -
sharedscripts+postrotate:确保所有匹配日志(access.log、error.log)切割完成后只执行一次 reopen,避免重复信号; -
dateformat -%Y%m%d:生成如access.log-20260720格式,清晰可读且利于脚本处理。
手动触发并验证
首次配置后,建议测试:
# 强制执行一次(不压缩,仅检查逻辑) sudo logrotate -d /etc/logrotate.d/nginx-binary # 实际执行(带压缩) sudo logrotate -f /etc/logrotate.d/nginx-binary # 检查结果 ls -lh /usr/local/nginx/logs/ # 应看到 access.log-20260720.gz、error.log-20260720.gz 及新的空 access.log/error.log
无需额外定时任务
logrotate 由系统级 cron 自动调度(如 /etc/cron.daily/logrotate),每日凌晨执行,无需你再配 crontab。可通过 sudo cat /etc/anacrontab 或 sudo systemctl list-timers | grep logrotate 确认计划状态。
不复杂但容易忽略的是权限匹配和信号方式——用 kill -USR1 直接通知 nginx master,比 reload 更精准,也完全兼容二进制部署场景。











