温馨提示×

nginx日志为何占用过高

小樊
32
2026-09-17 19:34:05
栏目: 编程语言

Nginx 日志占用过高(磁盘空间暴涨、IO 高、文件过大)通常由以下几类原因导致,可按优先级排查:


一、日志级别设置过低(最常见)

现象access.logerror.log 增长极快
原因

  • error_log 级别设为 debug / info
  • 访问量本身很大,且记录了所有请求

解决

error_log /var/log/nginx/error.log warn;

访问日志可只记录必要字段,或关闭不需要的日志:

access_log off;  # 某些静态资源

二、未做日志切割(log rotation)

现象:单个 access.log 几个 GB 甚至几十 GB
原因

  • 没配置 logrotate
  • 或用 nocopytruncate 但 Nginx 没 reload

解决(标准做法):

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

三、访问量异常(爬虫 / 攻击 / 恶意请求)

现象:日志短时间爆量
原因

  • 被 CC / DOS 攻击
  • 搜索引擎疯狂爬取
  • 错误配置导致重定向死循环(日志疯狂写)

排查

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

解决

  • 限流
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
  • 封 IP / User-Agent
  • 检查 rewrite 是否死循环

四、记录了不必要的内容

现象:单行日志特别长
原因

  • 记录了 $request_body
  • 记录了大文件上传内容
  • 自定义 log_format 太冗余

建议

  • 不要记录 body
  • 静态资源单独处理:
location ~* \.(js|css|png)$ {
    access_log off;
}

五、磁盘 IO 被拖垮(不是空间问题)

现象:磁盘占用不高,但系统卡
原因

  • 同步写日志(尤其是 error.log debug)
  • 机械盘 + 高并发

解决

  • 降低日志级别
  • 日志放独立磁盘 / SSD
  • 使用 buffer
access_log /var/log/nginx/access.log main buffer=32k flush=5s;

六、Nginx 没真正轮转(经典坑)

现象:logrotate 执行了,但文件还在变大
原因

  • 切割后没发 USR1
  • 用了 copytruncate 但 Nginx 仍写原 inode

验证

ls -i access.log

确认 Nginx 写的是新文件。


快速自查清单

  1. du -sh /var/log/nginx
  2. nginx -T | grep log
  3. 看是否有 debug
  4. 是否有 logrotate
  5. 最近是否有流量异常

如果你愿意,可以把 nginx.conf 相关日志配置磁盘占用截图 发我,我可以直接帮你定位是哪一类问题。

0