外贸站Nginx日志切割自动归档节省磁盘

为什么外贸站需要做Nginx日志切割

外贸站通常面向海外客户,访问量波动大,高流量时Nginx日志可能每天增长数百MB甚至GB。
如果不做切割,几个月后日志文件就会撑满磁盘,导致网站响应变慢甚至宕机。
手动清理不仅麻烦,还容易误删正在写入的日志。
本文教你用系统自带的 logrotate 工具,实现每日自动切割、压缩归档老日志,释放磁盘空间的同时保留历史记录以备排查。

准备工作:确认环境和日志位置

在执行切割配置前,请确保你已登录服务器,并具备sudo权限。
以下操作在CentOS 7/8、Ubuntu 20.04/22.04等主流Linux发行版上通用。

  1. 确认Nginx安装以及日志目录
ls -l /var/log/nginx/access.log /var/log/nginx/error.log

如果路径不同(比如自定义路径),记住它,后续配置时需要替换。

  1. 检查logrotate是否已安装(几乎所有发行版默认自带)
which logrotate && logrotate --version

如果没有输出,用包管理器安装:

  • CentOS: sudo yum install logrotate
  • Ubuntu: sudo apt install logrotate
  1. 确保Nginx日志目录可写权限给logrotate用户(通常为root或syslog)
ls -ld /var/log/nginx/

如果权限不对(例如目录只有nginx用户可写),
logrotate切不动日志,
需要调整:sudo chmod 755 /var/log/nginx/sudo chown root:
adm /var/log/nginx/
(根据你的系统调整)。

配置logrotate实现Nginx日志自动切割与归档

logrotate的配置文件位于 /etc/logrotate.d/,我们创建一个专用于Nginx的配置。

sudo nano /etc/logrotate.d/nginx

粘贴以下内容(请根据你的Nginx日志路径和pid文件位置微调):

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

参数解释

  • daily:每日切割一次。
  • rotate 30:保留30个归档文件,超期自动删除。
  • compress:用gzip压缩老日志,显著节省磁盘。
  • delaycompress:跳过最近一次归档的压缩,防止日志写入过程被压缩干扰。
  • missingok:如果日志文件丢失也不报错。
  • notifempty:如果日志为空,不切割。
  • create 640 nginx adm:切割后创建新日志文件,设置权限和属主。
  • sharedscripts:所有日志切割完成后只执行一次postrotate脚本。
  • postrotate...endscript:向Nginx主进程发送USR1信号,让Nginx重新打开日志文件,避免日志继续写入旧文件。

保存退出后,可以手动测试配置是否正确:

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

-d(debug模式)只模拟,不实际执行。
如果输出没有错误,说明配置有效。

让切割自动运行(确认cron任务)

logrotate本身由系统的cron定时任务驱动,默认每天凌晨运行一次。
检查cron配置:

sudo cat /etc/cron.daily/logrotate

如果存在,logrotate会自动执行。
如果不确定,也可以强制立即执行一次检查效果:

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

-f 表示强制轮转。
执行后检查 /var/log/nginx/ 目录,应该能看到类似 access.log.1.gz 的压缩文件,并且原 access.log 文件变为新的空文件。

避坑指南:常见问题与解决方法

  1. 切割后日志仍然写入旧文件
  • 原因:postrotate没有正确发送USR1信号,或者pid路径不对。
  • 解决:确认Nginx pid路径(cat /var/run/nginx.pid),如路径不同则在配置中修改。也可以使用更通用的方法:service nginx reloadsystemctl reload nginx
  1. 权限不足导致切割失败
  • 报错:error: failed to rename /var/log/nginx/access.log
  • 检查日志目录权限和create参数中的用户/组是否正确,通常设置为 nginx:adm 或 root:adm。
  1. compress不生效,日志未压缩
  • 原因:漏写compress或delaycompress导致压缩延后。
  • 确认配置中有compress字段。另外如果磁盘空间不足,logrotate可能跳过压缩,先检查磁盘空间。
  1. 日志删除过快
  • 调整rotate数值,例如设为90(保留3个月)。

效果验证与清理确认

完成配置并等待一天(或强制运行后),用以下命令检查效果:

# 查看日志目录大小变化(执行前后对比)
du -sh /var/log/nginx/

# 列出归档文件
ls -lh /var/log/nginx/

预期输出中除了access.log和error.log,还有 access.log.1.gz error.log.1.gz 等压缩文件,每个文件大小远小于原始日志。
磁盘空间显著释放。

如果发现日志大小没降,可能当前访问量低,观察几天;
或者检查logrotate日志(通常 /var/log/logrotate.log/var/lib/logrotate/status)排查执行情况。

FAQ:外贸站运维常见疑问

问:切割后Nginx性能会受影响吗?
答:不会。USR1信号让Nginx优雅重新打开日志文件,对正常请求几乎没有影响。

问:可以按周切割吗?
答:可以,把daily改为weekly或monthly,同时调整rotate数值。外贸站流量大建议用daily。

问:我想把归档日志存到另一个盘怎么办?
答:可以在配置文件中使用 olddir /path/to/archive 指定归档目录。但注意该目录必须存在,且权限正确。

问:logrotate没执行怎么办?
答:先手动运行 sudo logrotate -v /etc/logrotate.d/nginx(-v 输出详细信息)。如果没出错,检查cron是否正常:sudo systemctl status cron

如果你按照本文步骤操作,你的外贸站Nginx日志现在应该已经进入自动化切割归档流程,磁盘空间再也不会被日志撑满。
遇到问题可以返回本节对照排查。
实际生产环境中,建议每周检查一次logrotate状态,确保自动化持续有效。

希望这篇 外贸站Nginx日志切割自动归档节省磁盘 的教程能帮你省心运维。
如果觉得有用,欢迎收藏或分享给同样在外贸站运维中挣扎的朋友。

分享到:
上一篇
跨境独立站负载均衡多住宅服务器分发流量
下一篇
家用住宅主机多开Docker容器互不干扰隔离
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意