Nginx需借助外部脚本实现磁盘检测与动态日志开关:定时用df检查使用率,≥90%时重命名日志文件、重载nginx并告警;配置open_log_file_cache提升容错,或通过软链接切换日志配置片段实现无损暂停。

Nginx 本身不支持磁盘空间检测和动态日志开关,需借助外部脚本 + 系统机制协同实现。核心思路是:定时检查磁盘使用率 → 达到阈值时重命名或软链接日志文件 → 发送告警 → 可选暂停写入(通过重载配置或中断访问日志路径)。
用 shell 脚本监控磁盘并触发动作
在 /usr/local/bin/check-disk-nginx.sh 中写入以下逻辑(以 /var/log/nginx 所在分区为例):
- 用
df -h /var/log/nginx | awk 'NR==2 {print $5}' | sed 's/%//'获取使用率数值 - 若 ≥90%,执行:
mv /var/log/nginx/access.log /var/log/nginx/access.log.suspend和同理处理error.log - 运行
nginx -s reload使 Nginx 重新打开日志文件(此时因原文件被移走,新请求日志将写入空文件或失败,取决于 open_log_file_cache 配置) - 调用
mail、curl或本地 webhook 发送告警
配合 Nginx 配置避免日志写入失败崩溃
确保 Nginx 不因日志路径异常而报错或卡住:
- 在
http或server块中设置:open_log_file_cache max=1000 inactive=10s min_uses=2 valid=1m;,提升日志文件句柄缓存容错性 - 避免使用
buffer或gzip写日志(如access_log ... buffer=64k gzip),防止缓冲未刷盘导致丢失 - 日志路径建议用绝对路径,且确保 nginx worker 进程对目录有写权限(即使文件被移走,mkdir/write 权限仍需保留)
更稳妥的“暂停写入”方案:动态注释日志指令
不依赖文件移动,而是修改配置后重载:
- 准备两个配置片段:
/etc/nginx/conf.d/access-log-on.conf(含access_log /var/log/nginx/access.log;)和access-log-off.conf(为空或仅注释行) - 脚本中达到阈值时:
ln -sf /etc/nginx/conf.d/access-log-off.conf /etc/nginx/conf.d/active-access-log.conf - 再执行
nginx -s reload,Nginx 将不再写 access 日志(error.log 仍工作,保障故障可查) - 恢复时换回
access-log-on.conf并 reload 即可
补充建议:自动化与可观测性
让机制更可靠:
- 用
cron每 2–5 分钟执行一次检查脚本(避免太频繁 IO,也防漏检) - 脚本开头加锁(如
flock -n /tmp/disk-check.lock)防止并发冲突 - 记录每次操作到独立日志(如
/var/log/nginx-disk-monitor.log),方便追溯 - 搭配 Prometheus + Node Exporter 可图形化展示磁盘趋势,提前干预


















