Nginx 源码安装后需手动配置 logrotate:确认日志路径(如 /usr/local/nginx/logs/*.log)、运行用户(如 nginx),创建 /etc/logrotate.d/nginx 文件,设置 daily 轮转、30 天保留、0644 权限及 kill -USR1 重开日志,并用 logrotate -d/-vf 验证。

Nginx 源码安装后,默认不会自动集成 logrotate 配置,需要你手动创建规则并确保日志路径、权限和重载逻辑匹配实际部署环境。关键在于三点:日志路径要准确、轮转后必须通知 Nginx 重新打开日志文件、属主与权限需一致。
日志路径确认与权限对齐
源码安装的 Nginx 通常把日志放在 /usr/local/nginx/logs/ 下(除非 configure 时用 --prefix 指定了其他路径)。先确认真实路径:
/usr/local/nginx/sbin/nginx -t 2>/dev/null | grep "conf" # 查看配置加载路径 grep "access_log\|error_log" /usr/local/nginx/conf/nginx.conf # 查看实际日志路径
常见路径是:
-
/usr/local/nginx/logs/access.log -
/usr/local/nginx/logs/error.log
同时确认运行用户(比如 nginx 用户):
ps aux | grep nginx | grep master | awk '{print $1}' # 通常是 nginx 或 www-data 后续 create 和 postrotate 中的用户/组必须与此一致。
创建 logrotate 配置文件
在 /etc/logrotate.d/nginx 新建配置(注意文件名不带扩展名):
/usr/local/nginx/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 nginx nginx
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}说明:
-
daily表示每天切割一次;也可换为size 100M实现按大小触发 -
rotate 30保留最近 30 个归档(如access.log.1.gz到access.log.30.gz) -
create 0644 nginx nginx确保新日志文件权限和属主正确(对应上一步查到的用户) -
sharedscripts+postrotate避免对每个.log文件重复发信号 -
kill -USR1是 Nginx 重开日志的标准方式(不是 reload,reload 会重启进程)
验证与调试
不要直接上线,先测试:
- 检查语法是否合法:
logrotate -d /etc/logrotate.d/nginx
这会模拟执行,输出详细动作但不改动任何文件。
- 手动强制执行一次(观察是否生成
.1文件、是否压缩、是否重开了日志):logrotate -vf /etc/logrotate.d/nginx
- 切割后检查:
ls -l /usr/local/nginx/logs/ tail -n 1 /usr/local/nginx/logs/access.log # 应为新内容
补充建议
- 如果使用
systemd管理 Nginx,且 PID 文件不在默认位置(比如用了PIDFile=自定义),请同步更新postrotate中的路径 - 若日志目录不在
/usr/local/nginx/logs/,请严格替换所有路径,包括create行后的属主设置也要匹配实际用户 - 不建议用
copytruncate替代kill -USR1:它会直接截断原文件,可能丢失正在写入的日志片段
配置生效后,系统每日通过 /etc/cron.daily/logrotate 自动触发,无需额外加 crontab。


















