重庆云主机Nginx日志轮转如何配置?
- 来源:纵横数据
- 作者:中横科技
- 时间:2026/9/9 17:25:42
- 类别:新闻资讯
Nginx默认不会自动切割日志文件,这一点很多运维新手容易忽略。一台重庆云主机上的Nginx跑上大半年没人管,access.log一个文件就能膨胀到几十GB,直接把系统盘撑满,导致网站无法访问、SSH登录都变得卡顿。日志轮转就是解决这个问题的核心手段,它能自动将旧日志归档、压缩、清理,确保磁盘空间始终可控。下面从工具选型到完整配置,一步步讲清楚怎么做。
一、为什么必须做日志轮转
Nginx的访问日志和错误日志会随着请求量持续增长,如果不加干预,一个日均百万PV的网站,单月access.log就能轻松超过10GB。日志文件过大会带来三个直接问题:第一,磁盘空间被持续蚕食,最终导致系统盘满、服务崩溃;第二,用grep、awk等工具检索超大日志文件时速度极慢,排查线上问题效率大打折扣;第三,日志文件过大时,Nginx写入日志的I/O开销也会增加,影响整体性能。
日志轮转的本质就是给日志建立一套"生命周期管理机制",定期将当前日志重命名归档,创建新的空日志文件继续写入,同时对过期归档进行压缩或清理。
二、选择logrotate:Linux自带的日志管理利器
Linux系统自带的logrotate是管理Nginx日志轮转的最佳选择,绝大多数发行版都已经预装。它的优势在于配置简单、运行稳定、支持按时间或文件大小触发轮转,并且内置了压缩、权限设置、自定义脚本等实用功能。
先确认系统是否已安装logrotate,执行以下命令:
logrotate --version
如果输出了版本信息,说明已经就绪。如果没有安装,Ubuntu或Debian系统执行sudo apt install -y logrotate,CentOS或RHEL系统执行sudo yum install -y logrotate。
三、编写Nginx日志轮转配置文件
logrotate的应用级配置统一放在/etc/logrotate.d/目录下,每个服务一个独立文件。创建Nginx的轮转配置文件:
sudo nano /etc/logrotate.d/nginx
写入以下内容:
/var/log/nginx/*.log {
daily
missingok
rotate
30
compress
delaycompress
notifempty
create 0640 nginx
adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill
-USR1 cat /var/run/nginx.pid
fi
endscript
}
下面逐行解释每个参数的作用。
/var/log/nginx/*.log是匹配规则,表示对Nginx日志目录下的所有.log文件执行轮转。如果你的Nginx日志路径不同,需要相应修改。
daily表示每天执行一次轮转。也可以替换为weekly(每周)、monthly(每月),或者使用size 100M表示当日志文件达到100MB时触发轮转。对于流量较大的网站,建议用size参数替代daily,避免单天内日志量过大来不及切割。
missingok表示如果日志文件不存在,直接跳过不报错,避免在某些特殊情况下轮转任务中断。
rotate 30表示保留最近30份归档日志,超过30份的最旧归档会被自动删除。这个数值根据你的磁盘空间和合规留存要求来定,一般14到30天足够日常排查使用。
compress表示对归档日志使用gzip压缩,一个几百MB的日志文件压缩后通常只有几十MB,大幅节省磁盘空间。
delaycompress表示延迟一次压缩,最近一次轮转产生的归档文件暂不压缩,等到下一次轮转时再压缩。这样做的好处是,如果你需要查看昨天的日志,可以直接打开未压缩的文件,不用先解压。
notifempty表示如果日志文件为空,则跳过轮转,避免产生一堆无意义的空归档文件。
create 0640 nginx adm表示轮转后创建新的日志文件,权限设为0640,属主为nginx,属组为adm。这里的用户名和组名需要根据你实际的Nginx运行用户来调整,比如Ubuntu系统下Nginx默认以www-data用户运行,就应该写成create 0640 www-data www-data。
sharedscripts表示当匹配到多个日志文件时,postrotate脚本只执行一次,而不是每个文件都执行一次。这对于Nginx来说很重要,因为只需要给Nginx进程发一次信号就够了。
postrotate和endscript之间包裹的是轮转完成后要执行的脚本。核心操作是kill -USR1向Nginx主进程发送USR1信号,通知它重新打开日志文件。这一步至关重要,因为轮转只是把旧日志文件重命名了,Nginx进程仍然持有旧文件的文件描述符,如果不发信号让它重新打开,Nginx会继续往已经被重命名的旧文件里写数据,新的access.log就不会有任何内容。USR1信号触发的是优雅重开操作,不会中断当前正在处理的请求,对线上服务零影响。
四、一个真实案例:从磁盘告警到自动轮转
某团队在重庆云主机上部署了一套API网关服务,Nginx作为统一入口,后端对接多个微服务。上线初期没有配置日志轮转,运营三个月后某天凌晨收到云监控告警,系统盘使用率达到100%。登录服务器执行df -h查看,发现根分区已经满了,再用du -sh /var/log/nginx/*排查,发现access.log一个文件就占了23GB。
紧急处理方式是先手动执行echo "" > /var/log/nginx/access.log清空日志释放空间,恢复服务。但这种方式治标不治本,清空操作会导致正在写入的日志丢失,而且文件描述符没有释放,磁盘空间实际上并没有完全回收,需要重启Nginx才能真正释放。
按照上述方案配置好logrotate后,将轮转策略设为daily、保留30天、开启压缩。一个月后查看/var/log/nginx/目录,旧的日志文件被自动命名为access.log.1、access.log.2.gz等格式,最大的单个文件不超过500MB,磁盘占用从原来的20多GB降到了不到2GB,问题彻底解决。
五、按文件大小轮转:应对突发流量的策略
如果你的网站流量波动较大,纯按天轮转可能不够灵活。比如大促期间一天的日志量可能超过10GB,而平时只有几百MB。这时可以改用按大小触发的方式:
/var/log/nginx/*.log {
size 500M
rotate
10
compress
delaycompress
missingok
notifempty
create 0640 nginx
adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill
-USR1 cat /var/run/nginx.pid
fi
endscript
}
size 500M表示当日志文件达到500MB时立即触发轮转,不受时间周期限制。这种方式能确保单个日志文件永远不会过大,特别适合流量不可预测的场景。
六、测试与验证
配置完成后,先用调试模式检查配置是否有语法错误:
sudo logrotate -d /etc/logrotate.d/nginx
-d参数表示调试模式,它会模拟执行轮转过程并输出详细的操作日志,但不会真正执行任何文件操作。如果输出中没有报错信息,说明配置正确。
确认无误后,可以强制执行一次轮转来验证效果:
sudo logrotate -f /etc/logrotate.d/nginx
-f参数表示强制执行,忽略时间或大小条件,立即执行轮转。执行后查看/var/log/nginx/目录,应该能看到旧的日志文件被重命名,同时生成了新的空日志文件。再用curl访问一下网站,检查新的access.log中是否有新的请求记录,确认Nginx已经正确切换到新文件写入。
七、常见坑位提醒
第一个坑是轮转后日志不写入新文件。原因几乎都是因为postrotate脚本没有正确执行,或者Nginx的PID文件路径不对。不同发行版的Nginx PID文件位置可能不同,常见路径有/var/run/nginx.pid和/run/nginx.pid,需要根据实际情况调整。
第二个坑是create指令中的用户名和权限不匹配。如果Nginx以www-data用户运行,但create指令写的是nginx用户,新创建的日志文件Nginx进程没有写入权限,会导致500错误或日志丢失。
第三个坑是在Docker容器环境中,宿主机的logrotate无法直接向容器内的Nginx发送信号。这种情况下建议将Nginx的access_log指向stdout,由Docker的日志驱动来管理轮转,通过docker run时的--log-opt max-size和--log-opt max-file参数来控制日志大小和数量。
总结
重庆云主机上Nginx的日志轮转配置,核心就是利用Linux自带的logrotate工具,在/etc/logrotate.d/nginx中编写轮转规则。关键配置包括轮转周期或大小阈值、归档保留数量、gzip压缩、以及轮转后通过USR1信号通知Nginx重新打开日志文件。这套方案配置一次即可永久生效,由系统cron自动触发执行,不需要人工干预,是保障Nginx长期稳定运行的基础运维操作。
纵横云服务器租赁,欢迎随时联系,客服联系方式:QQ3494196421,手机微信19906048601。




使用微信扫一扫
扫一扫关注官方微信 

