nginx日志分割

发布于:2025-07-29 ⋅ 阅读:(24) ⋅ 点赞:(0)

详细步骤

第零步:准备工作(创建脚本目录)

我们先把要用的脚本放在一个专门的目录里,方便管理。

# 在 web 用户家目录下创建一个名为 scripts 的目录
mkdir -p /home/web/scripts

# 进入这个目录
cd /home/web/scripts
第一步:编写日志切割脚本

这是核心步骤。我们将创建一个 shell 脚本,来完成之前 logrotate 所做的所有事情。

  1. 创建脚本文件

    # 使用 vim 或 nano 创建脚本文件
    vim rotate_nginx_logs.sh
    
  2. 粘贴以下脚本内容

    请将下面所有的代码完整地复制并粘贴到 rotate_nginx_logs.sh 文件中。

    #!/bin/bash
    
    # =================================================================
    # Nginx Log Rotation Script for non-root users
    # Author: Your Name
    # =================================================================
    
    # --- 配置区 ---
    # 你的 Nginx 日志文件所在目录
    LOGS_PATH="/home/web/nginx/logs"
    
    # 你的 Nginx PID 文件路径
    PID_FILE="$LOGS_PATH/nginx.pid"
    
    # 保留多少天的日志(例如,保留14天的压缩日志)
    RETAIN_DAYS=14
    # --- 配置区结束 ---
    
    
    # --- 执行区 ---
    # 检查日志目录是否存在
    if [ ! -d "$LOGS_PATH" ]; then
      echo "错误: 日志目录 $LOGS_PATH 不存在。"
      exit 1
    fi
    
    # 检查 PID 文件是否存在
    if [ ! -f "$PID_FILE" ]; then
      echo "错误: Nginx PID 文件 $PID_FILE 未找到。"
      exit 1
    fi
    
    # 1. 移动(重命名)当前的日志文件
    # 使用昨天的日期来命名备份文件,更符合常规
    YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
    mv "$LOGS_PATH/access.log" "$LOGS_PATH/access.log-${YESTERDAY}"
    mv "$LOGS_PATH/error.log" "$LOGS_PATH/error.log-${YESTERDAY}"
    
    # 2. 通知 Nginx 重新生成新的日志文件
    # 这是最关键的一步,与之前手动操作完全一样
    kill -USR1 $(cat "$PID_FILE")
    
    # 等待一小会儿,确保新日志文件已创建
    sleep 5
    
    # 3. 压缩刚刚移动的旧日志文件
    gzip "$LOGS_PATH/access.log-${YESTERDAY}"
    gzip "$LOGS_PATH/error.log-${YESTERDAY}"
    
    # 4. 删除超过保留天数的旧日志文件
    # find 命令会查找所有超过 RETAIN_DAYS 天的 .gz 文件并删除它们
    find "$LOGS_PATH" -name "*.log-*.gz" -mtime +$RETAIN_DAYS -exec rm -f {} \;
    
    echo "Nginx 日志切割完成。"
    # --- 执行区结束 ---
    
  3. 保存并退出
    vim 中,按 ESC,然后输入 :wq 并回车。

第二步:给脚本添加执行权限

创建的脚本默认是没有执行权限的,我们需要给它加上。

# 确保你还在 /home/web/scripts 目录下
chmod +x rotate_nginx_logs.sh

现在你可以试着手动运行一下这个脚本,看看它是否能正常工作:

./rotate_nginx_logs.sh

如果一切正常,它会切割当前的日志,并输出 “Nginx 日志切割完成”。

第三步:设置定时任务 (Cron Job)

这是实现“自动化”的关键。我们将使用 crontab 命令来为 web 用户添加一个定时任务。

  1. 编辑当前用户的 crontab

    crontab -e
    

    第一次运行时,系统可能会让你选择一个默认的文本编辑器(如 nanovim),推荐选择 nano,因为它对新手更友好。

  2. 添加定时任务规则

    在打开的文件的最末尾,添加新的一行,内容如下:

    # 每天凌晨 00:01 执行 Nginx 日志切割脚本
    01 00 * * * /home/web/scripts/rotate_nginx_logs.sh > /dev/null 2>&1
    
  3. 规则解释

    • 01 00 * * *: 这是 cron 的时间格式,代表“每天的 00 点 01 分”。(分钟 小时 日 月 周)
    • /home/web/scripts/rotate_nginx_logs.sh: 这是要执行的脚本的绝对路径。
    • > /dev/null 2>&1: 这部分的意思是,将脚本执行过程中所有正常的输出(>)和错误输出(2>&1)都重定向到“黑洞”(/dev/null)里。这样做可以防止 cron 因为脚本有输出而给你发送邮件,保持系统干净。
  4. 保存并退出

    • 如果你用的是 nano,按 Ctrl + X,然后会提示你是否保存,按 Y,最后按 Enter 确认文件名。
    • 如果你用的是 vim,按 ESC,然后输入 :wq 并回车。

    保存后,系统会提示 crontab: installing new crontab,这表示你的定时任务已经成功设置好了!


总结

现在,你已经成功地在没有 root 权限的情况下,建立了一套完全属于 web 用户的、功能完备的自动化日志切割系统。

从现在开始:

  1. 每天凌晨 00:01cron 会自动触发你的 rotate_nginx_logs.sh 脚本。
  2. 脚本会重命名前一天的日志,并通知 Nginx 创建新日志文件。
  3. 脚本会压缩重命名后的日志文件。
  4. 脚本会自动删除14天前的旧压缩日志。

你再也不需要手动管理这些日志文件了。


网站公告

今日签到

点亮在社区的每一天
去签到