日志目录跑满磁盘后,应清空日志内容而非删除文件,再挂载新磁盘、修改nginx配置重定向日志路径,通过nginx -s reload平滑切换,最后启用logrotate和磁盘监控防复发。

日志目录跑满磁盘后,不能直接删文件或移动正在写入的日志,否则会导致 Nginx worker 进程卡死、服务假死(仅剩 master 进程,502/504 频发)。平滑迁移的核心是:**不中断服务、不丢失句柄、不丢日志、分步释放空间并重定向写入路径**。
一、紧急止血:清空内容而非删除文件
确认磁盘已满(df -h)且 lsof +L1 | grep nginx 显示 deleted 日志被占用后,立即执行:
- 清空当前日志内容:
echo "" > /var/log/nginx/access.log和echo "" > /var/log/nginx/error.log - 避免使用
rm或mv,否则 Nginx 无法继续写入,worker 会挂起 - 若已误删,先
nginx -s reopen让进程重新打开日志文件,再检查lsof +L1是否清空
二、迁移准备:挂载新磁盘并验证权限
将新磁盘(如 /dev/sdb1)挂载到富余空间路径(例如 /data/logs),确保 Nginx 工作用户可读写:
sudo mkdir -p /data/logs/nginxsudo chown www-data:www-data /data/logs/nginx-
sudo chmod 755 /data/logs(父目录需有 x 权限才能进入) - 测试写入:
sudo -u www-data touch /data/logs/nginx/test.log
三、平滑切换日志写入路径
修改 Nginx 主配置(通常在 /etc/nginx/nginx.conf),将日志路径指向新位置:
- 全局 error_log:
error_log /data/logs/nginx/error.log warn; - HTTP 块内 access_log:
access_log /data/logs/nginx/access.log main; - 所有 server 或 location 中显式定义的
access_log也需同步更新 - 执行
nginx -t验证语法,再nginx -s reload平滑重载
reload 后,Nginx 会关闭旧日志文件句柄、打开新路径下的文件,原 /var/log/nginx/ 下的文件不再被写入,但旧句柄已释放,磁盘空间即时可用。
四、收尾与防复发
迁移完成后,需清理旧日志并建立长期机制:
- 手动压缩遗留大日志:
gzip /var/log/nginx/*.log(避开正在写入的access.log和error.log) - 启用 logrotate 管理新路径:
/data/logs/nginx/*.log,配daily、rotate 30、compress、postrotate nginx -s reopen - 加磁盘水位监控:
df -h | awk '$5+0 > 85 {print $0}' | mail -s "Disk Alert" admin@example.com
不复杂但容易忽略:迁移后务必检查 tail -f /data/logs/nginx/access.log 是否有新请求写入,同时确认 /var/log/nginx/ 不再增长。











