最有效、最稳妥的做法是为 /var/log 单独分一个分区。日志撑爆根目录会导致 SSH 登录失败、包管理器异常甚至系统僵死,独立分区可实现硬隔离,推荐 20–50GB,ext4 文件系统,配合 logrotate、journald 限容和使用率监控。

直接给 /var/log 单独划一个分区,是最有效、最稳妥的硬隔离手段。动态代理网关(如 Nginx、Envoy)本身不存数据,但严重依赖系统临时文件、日志写入和内核缓冲区——一旦根分区被日志撑爆,它会立刻失去健康检查能力、无法写 access_log/error_log、甚至因无法创建 socket 文件而拒绝新连接,最终表现为“挂起”或 502/504 响应堆积。
为什么必须独立 /var/log 而非仅靠配额或轮转
logrotate 只能事后切分压缩,无法阻止单次突发写入(如后端服务死循环打错日志)瞬间占满空间;磁盘配额需用户级控制,而网关进程常以 root 或专用用户(如 nginx)运行,若未精准限制,防护即失效。独立分区则从文件系统层切断影响链:即使 /var/log 分区写满,/、/tmp、/run 仍可用,SSH 登录、systemd 状态查询、网关 reload 操作全部不受干扰。
分区大小与文件系统选择
中小规模代理网关(QPS ≤ 5k,日均日志量 ≤ 5GB)建议分配 20–30GB;高流量场景(含 WAF 日志、全链路 trace、审计日志)建议 50GB 起步。使用 ext4 即可,挂载时加 noatime 减少元数据更新开销:
UUID=xxx /var/log ext4 defaults,noatime,usrquota,grpquota 0 2
关键配套动作不能省
- 强制限制 journald:创建 /etc/systemd/journald.conf.d/limit.conf,写入 SystemMaxUse=512M,避免 journal 与网关日志争空间
- 关闭冗余日志:Nginx 配置中禁用非必要模块日志,例如 error_log /dev/null crit;,access_log 按需开启
- 监控阈值设为 80%:用 df -h /var/log 定期采集,超限时触发告警并自动清理最老的 3 个 logrotate 归档(find /var/log -name "*.gz" -mtime +30 -delete)
验证是否真正生效
执行 sudo dd if=/dev/zero of=/var/log/filltest bs=1M count=30000(填满至接近上限),观察:
– df -h / 显示根分区使用率不变
– curl -I http://localhost 仍返回 200,无延迟升高
– sudo systemctl status nginx 显示 active (running),无 failed 提示
– 此时再尝试写新日志:logger "test" 应报错 No space left on device,但不影响 nginx 进程存活与响应











