nginx 日志手动切割核心是三步:备份旧日志、创建新日志文件、执行 nginx -s reopen 重载;脚本通过 mv 重命名、touch 创建空文件并 chown 设置权限、最后发送 reopen 信号实现零停机切割。

手动切割 Nginx 日志并重载,核心是三步:备份旧日志、创建新日志文件、通知 Nginx 重新打开日志文件(不中断服务)。下面是一个简洁可靠的 Shell 脚本写法,适用于大多数 Linux 环境。
脚本关键逻辑说明
使用 mv + touch + nginx -s reopen 组合实现零停机切割:
- mv 将当前 access.log / error.log 重命名(如加日期后缀),归档为历史日志
- touch 创建空的新日志文件,确保权限与原日志一致(Nginx 主进程会以 worker 用户身份写入)
- nginx -s reopen 发送信号让 Nginx 主进程重新打开日志文件(所有 worker 进程自动切换到新文件)
推荐 Shell 脚本(可直接保存为 /usr/local/bin/nginx-log-rotate.sh)
#!/bin/bash
# Nginx 日志手动切割脚本
# 假设日志路径为 /var/log/nginx/,请按实际调整
NGINX_LOG_DIR="/var/log/nginx"
ACCESS_LOG="$NGINX_LOG_DIR/access.log"
ERROR_LOG="$NGINX_LOG_DIR/error.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 备份并切割 access.log
if [ -f "$ACCESS_LOG" ]; then
mv "$ACCESS_LOG" "${ACCESS_LOG}.${DATE}"
touch "$ACCESS_LOG"
chown nginx:nginx "$ACCESS_LOG" >/dev/null 2>&1 || true # 根据实际用户组调整,如 www-data
fi
# 备份并切割 error.log
if [ -f "$ERROR_LOG" ]; then
mv "$ERROR_LOG" "${ERROR_LOG}.${DATE}"
touch "$ERROR_LOG"
chown nginx:nginx "$ERROR_LOG" >/dev/null 2>&1 || true
fi
# 通知 Nginx 重新打开日志文件
if command -v nginx >/dev/null 2>&1; then
nginx -s reopen &>/dev/null
if [ $? -eq 0 ]; then
echo "✅ Nginx 日志已切割并重载:$(date)"
else
echo "❌ Nginx 重载失败,请检查配置或权限"
fi
else
echo "❌ nginx 命令未找到,请确认安装路径"
fi
执行前注意事项
- 确认 NGINX_LOG_DIR 和日志文件名与你的配置一致(可通过
nginx -t -v或grep access_log /etc/nginx/nginx.conf查看) - 确保脚本有执行权限:
chmod +x /usr/local/bin/nginx-log-rotate.sh - 确认 Nginx 运行用户(如
nginx或www-data)对新日志文件有写权限;touch后建议用chown显式设置属主 - 测试时先手动运行一次:
/usr/local/bin/nginx-log-rotate.sh,观察是否生成带时间戳的备份文件且 Nginx 无报错
进阶:配合 cron 每日自动切割
编辑 root 的 crontab:sudo crontab -e,添加一行(例如每天凌晨 00:01 执行):
1 0 * * * /usr/local/bin/nginx-log-rotate.sh >/var/log/nginx/rotate.log 2>&1
这样既能自动归档,又能保留脚本执行日志用于排查。











