外贸站Nginx日志切割自动归档节省磁盘
为什么外贸站需要做Nginx日志切割
外贸站通常面向海外客户,访问量波动大,高流量时Nginx日志可能每天增长数百MB甚至GB。
如果不做切割,几个月后日志文件就会撑满磁盘,导致网站响应变慢甚至宕机。
手动清理不仅麻烦,还容易误删正在写入的日志。
本文教你用系统自带的 logrotate 工具,实现每日自动切割、压缩归档老日志,释放磁盘空间的同时保留历史记录以备排查。
准备工作:确认环境和日志位置
在执行切割配置前,请确保你已登录服务器,并具备sudo权限。
以下操作在CentOS 7/8、Ubuntu 20.04/22.04等主流Linux发行版上通用。
- 确认Nginx安装以及日志目录
ls -l /var/log/nginx/access.log /var/log/nginx/error.log
如果路径不同(比如自定义路径),记住它,后续配置时需要替换。
- 检查logrotate是否已安装(几乎所有发行版默认自带)
which logrotate && logrotate --version
如果没有输出,用包管理器安装:
- CentOS:
sudo yum install logrotate - Ubuntu:
sudo apt install logrotate
- 确保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 文件变为新的空文件。
避坑指南:常见问题与解决方法
- 切割后日志仍然写入旧文件
- 原因:postrotate没有正确发送USR1信号,或者pid路径不对。
- 解决:确认Nginx pid路径(
cat /var/run/nginx.pid),如路径不同则在配置中修改。也可以使用更通用的方法:service nginx reload或systemctl reload nginx。
- 权限不足导致切割失败
- 报错:
error: failed to rename /var/log/nginx/access.log - 检查日志目录权限和create参数中的用户/组是否正确,通常设置为 nginx:adm 或 root:adm。
- compress不生效,日志未压缩
- 原因:漏写compress或delaycompress导致压缩延后。
- 确认配置中有compress字段。另外如果磁盘空间不足,logrotate可能跳过压缩,先检查磁盘空间。
- 日志删除过快
- 调整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日志切割自动归档节省磁盘 的教程能帮你省心运维。
如果觉得有用,欢迎收藏或分享给同样在外贸站运维中挣扎的朋友。