Nginx 日志轮转怎么做:用 logrotate 自动压缩并切换日志

Theo
Theo
发布时间:2026-08-24 | 40人浏览过
原创

前言

在 Nginx 服务器上,访问日志和错误日志会持续增长;如果长期不处理,磁盘占用和后续排查都会变得麻烦。比较稳妥的做法是交给 logrotate 自动轮转,本文按“检查工具、写配置、理解关键参数、执行测试”四步梳理,读完后可以判断这套配置是否适合自己的日志目录、用户权限和轮转频率。

在 Nginx 服务器上,访问日志和错误日志会持续增长;如果长期不处理,磁盘占用和后续排查都会变得麻烦。比较稳妥的做法是交给 logrotate 自动轮转,本文按“检查工具、写配置、理解关键参数、执行测试”四步梳理,读完后可以判断这套配置是否适合自己的日志目录、用户权限和轮转频率。

先确认系统里有 logrotate

大多数 Linux 发行版都会预装 logrotate。如果系统里没有,再用包管理器安装即可,常见方式包括 apt-get 或 yum。

确认完工具存在后,就可以单独给 Nginx 建一份轮转规则,避免和其他服务混在一起管理。

在 /etc/logrotate.d/ 下创建 Nginx 配置

先创建配置文件:

sudo touch /etc/logrotate.d/nginx

然后把下面这段内容写入文件:

/var/log/nginx/*.log {
daily
missingok
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}

这份配置的目标很直接:匹配 /var/log/nginx/ 目录下所有 .log 文件,按天轮转,保留写入连续性,并把旧日志压缩保存。

这份配置里的关键参数分别做什么

日志匹配与轮转频率

/var/log/nginx/*.log 用来指定参与轮转的日志文件;daily 表示每天轮转一次。如果业务量不大,也可以按需要改成 weekly 或 monthly。

Nginx 日志轮转测试结果流程图
手动测试后的结果检查手动执行一次 `logrotate -f`,可以直接验证旧日志是否被压缩、新日志是否成功创建。
Nginx 日志轮转配置结构示意图
Nginx 日志轮转配置结构图把常用 logrotate 选项拆成四组,更容易检查路径、频率、压缩和重开日志是否配置到位。

避免无意义报错和空轮转

missingok 的作用是日志文件不存在时直接跳过,避免报错;notifempty 表示空日志不轮转,减少无用文件。

压缩与延迟压缩

compress 会把轮转后的旧日志压缩成 .gz 文件,节省磁盘空间。delaycompress 则会把压缩动作推迟到下一轮,这样刚被切走的上一份日志不会立刻压缩,更适合还可能被后续流程读取的场景。

新日志文件权限与后置脚本

create 0640 www-data adm 表示轮转后立即创建新的日志文件,权限为 0640,属主是 www-data,属组是 adm。这里的用户和用户组要和你的 Nginx 实际运行身份匹配,否则新日志文件可能无法正常写入。

sharedscripts 表示即使匹配到多个日志文件,也只执行一次 postrotate 脚本。后面的脚本会检查 /var/run/nginx.pid 是否存在;如果存在,就执行:

kill -USR1 `cat /var/run/nginx.pid`

这一步很关键。它会向 Nginx 主进程发送 USR1 信号,通知 Nginx 重新打开日志文件,这样后续日志才能继续写入新文件,而不是仍然占着已经轮转出去的旧文件。

如何强制测试并确认结果

配置保存后,可以先手动触发一次:

sudo logrotate -f /etc/logrotate.d/nginx

-f 表示强制执行一次轮转,不等待既定周期。执行成功后,通常能看到两类结果:旧日志被处理并压缩为 .gz 文件,同时原位置生成新的空日志文件,供 Nginx 继续写入。

后续只要系统的 logrotate 定时任务正常运行,这套规则就会按设定频率自动生效;需要临时手动执行时,仍然可以继续使用同一条 sudo logrotate -f /etc/logrotate.d/nginx 命令。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表