温馨提示×

nginx日志为何很大

小樊
52
2026-07-07 14:53:19
栏目: 编程语言

nginx 日志很大的原因通常可以归结为访问量大、日志配置不合理、未做切割或未限制大小。下面从常见原因和优化建议两方面说明。


一、nginx 日志为何会很大

1. 访问量高

  • 网站或接口访问量大,尤其是:
    • 接口被频繁调用
    • 爬虫、扫描器、恶意请求多
  • 每个请求都会记录一条日志(access.log)

2. 日志级别设置过低

  • error_log 设置为 infodebug
  • 会记录大量非必要信息
error_log logs/error.log info;  # 太详细

3. 未做日志切割

  • nginx 默认不会自动分割日志
  • 日志会一直追加到同一个文件
  • 时间久了就会非常大

4. 记录了不必要的信息

  • access 日志格式中包含大量字段
  • 例如:
    • $request_body
    • $http_user_agent
    • $http_referer
    • $upstream_response_time

5. 静态资源也被记录

  • js / css / 图片 / 健康检查接口
  • 无业务价值但日志量巨大

6. 被攻击或异常流量

  • CC 攻击
  • 刷接口
  • 扫描器频繁访问

二、如何确认是哪种情况

查看日志大小

du -sh /var/log/nginx/*

查看访问日志增长速度

wc -l access.log

查看是否有异常请求

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

三、优化与解决方案

✅ 1. 开启日志切割(最重要)

使用 logrotate(推荐)

vim /etc/logrotate.d/nginx

示例:

/var/log/nginx/*.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        nginx -s reload
    endscript
}

✅ 2. 调整 error_log 级别

error_log logs/error.log warn;

级别建议:

  • 生产环境:warnerror
  • 调试时才用 info / debug

✅ 3. 精简 access 日志格式

只记录必要字段:

log_format main '$remote_addr - $request - $status';
access_log logs/access.log main;

避免记录:

  • request body
  • 过多 header

✅ 4. 不记录静态资源

location ~* \.(js|css|png|jpg|gif|ico|svg)$ {
    access_log off;
}

✅ 5. 关闭不需要的日志

  • 健康检查
  • 内部接口
location /health {
    access_log off;
}

✅ 6. 限制日志大小(不推荐单独使用)

access_log logs/access.log main buffer=32k flush=5m;

✅ 7. 防止恶意请求

  • 限流
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_req zone=one burst=20 nodelay;
  • 封禁异常 IP

四、常见合理大小参考

  • 中型网站:
    • access.log:几十 MB / 天
    • error.log:几 MB / 天
  • 超过 几百 MB / 天 基本都有优化空间

五、总结一句话

nginx 日志大,90% 的原因是:没做日志切割 + 记录了太多无用请求。

如果你愿意,可以把:

  • 你的 nginx.conf
  • access_log 示例贴出来

我可以帮你针对性精简配置

0