LNMP 服务器 Nginx 日志按天分割与自动清理
在 LNMP 环境中,默认的 Nginx 日志会持续写入单个文件,长期运行会导致日志文件过大,不便管理和分析。通过日志切割脚本,可以将日志按天分割成单独文件,并自动清理旧日志。
一、下载与配置日志切割脚本
1. 下载脚本到服务器(例如 /root/ 目录):
wget -O /root/cut_nginx_logs.sh http://soft.vpser.net/lnmp/ext/cut_nginx_logs.sh
2. 编辑脚本,根据你的环境修改关键参数:
vi /root/cut_nginx_logs.sh
脚本中需要关注的主要配置参数如下:
# 设置 Nginx 日志文件存储的根目录
log_files_path="/home/wwwlogs/"
# 设置切割后日志的存储路径格式,默认按年/月/组织
# 例如:/home/wwwlogs/2025/03/access_20250315.log
log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
# 设置需要切割的日志文件名(不含 .log 后缀),多个名称用空格分隔
# 此处的名称应对应 /home/wwwlogs/ 目录下的实际文件,如 access.log, vpser.net.log
log_files_name=(access vpser.net licess)
# 设置 Nginx 可执行文件的路径(用于切割后重载配置)
nginx_sbin="/usr/local/nginx/sbin/nginx"
# 设置日志保留天数,超过此天数的旧日志文件将被自动删除
save_days=30
重要说明:
log_files_name数组中的名称必须与log_files_path目录下待切割的日志文件名(去掉.log后缀)完全一致。- 如果你的 Nginx 安装路径不同,请修改
nginx_sbin变量。 save_days=30表示仅保留最近30天的日志,更早的会自动删除。
二、设置定时任务自动执行
为了每天自动执行日志切割,需要添加一个 Cron 定时任务。
1. 编辑当前用户的 Cron 任务表:
crontab -e
2. 在打开的文件末尾添加以下一行,表示每天凌晨0点0分执行切割脚本:
0 0 * * * /bin/bash /root/cut_nginx_logs.sh
(注意:原文中的 00 00 与 0 0 是等效写法,均代表0点0分。)
3. 保存并退出编辑器。Cron 服务会自动加载新的配置。
三、脚本工作原理与验证
该脚本主要执行以下操作:
- 切割:将指定的日志文件(如
access.log)复制并重命名为带昨日日期的文件(如access_20250315.log),然后清空原日志文件。 - 重载:向 Nginx 主进程发送
USR1信号,使其重新打开日志文件,确保后续日志写入新的空文件。 - 清理:根据
save_days设置,删除log_files_path下所有早于指定天数的.log文件。
你可以手动执行一次脚本以测试配置是否正确:
/bin/bash /root/cut_nginx_logs.sh
然后检查 /home/wwwlogs/ 目录下是否按年/月生成了新的日志文件,并且原日志文件已被清空。