【记录】Nginx日志过大导致服务器空间爆满

问题

最近发现有一个数据断了几天

  1. 尝试本地推送到 服务器,推送失败报错如下:
  2. 但是数据并不是完全中断,大多数图片数据都能顺利接收并覆盖
plain 复制代码
数据发送异常: obtLiveData, 异常信息: 500 Internal Server Error:
"<html><EOL><EOL><head><title>500 Internal Server Error</title></head><EOL><EOL><body><EOL><EOL><center><h1>500 Internal Server Error</h1></center><EOL><EOL><hr><center>nginx/1.28.0</center><EOL><EOL></body><EOL><EOL></html><EOL><EOL>"

排查

  1. 最后排查磁盘空间发现是nginx日志爆满
  2. 导致部分请求失败 返回500
  3. 由于日志需要保存 半年以上,nginx默认每次接收请求记录一次

而接口数据推送 每分钟1k+次请求 -> 每天约144万条日志,半年可能还是会超出空间

plain 复制代码
dh -f   # 查看磁盘空间

du -sh /* | sort -hr  # 查看目录下哪个文件夹占用最多

优化

  1. 由于主要接收一个数据接口的推送请求,故专门对改接口 的日志 单独进行极简配置

如下为 nginx 配置极简日志

javascript 复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;

    
    # 默认日志格式
    log_format main '$remote_addr - [$time_local] "$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

    # 推送专用极简格式,降低日志空间占用
    log_format push_minimal '$remote_addr [$time_local] $status';

    # .... 其他配置
    server
    {
        charset utf8;
        listen 443 ssl;
  	    http2 on;

        # 仅针对高频推送接口:极简日志
        location = /api/receive/data {
            access_log /usr/local/nginx/logs/qj_push_data.access.log push_minimal;
            proxy_pass http://localhost:8025/api/receive/data;
        }

        # 后端代理
        location /api {
                proxy_pass http://localhost:8025/api;
        }

        # 。。。。 其余配置
    }
}

如图,右侧则是针对单一接口配置的 单独日志文件

  1. 半年自动备份功能

使用 logrotate 服务器每天0点会自动轮询

a. 查看是否安装(阿里云服务器默认安装)

javascript 复制代码
> rpm -q logrotate
logrotate-3.14.0-6.0.1.1.al8.x86_64

b. 查看nginx用户 通常是 nginx、nobody 或 www-data

我是自己上传安装包安装的,用户是nobody

ps aux | grep nginx

c. 配置备份内容

新建文件

plain 复制代码
vi /etc/logrotate.d/nginx-qj-push

然后再文件中配置备份内容,我是180天 esc + :wq 保存并退出

plain 复制代码
/usr/local/nginx/logs/qj_push_data.access.log {
    daily
    rotate 180
    compress
    delaycompress
    missingok
    notifempty
    create 640 nobody nobody
    sharedscripts
    postrotate
        /usr/local/nginx/sbin/nginx -s reopen >/dev/null 2>&1 || true
    endscript
}

如此便配置成功了,可以手动测试 logrotate 是否生效

可以看到目录下多了一个备份文件,且原日志文件是空的

plain 复制代码
logrotate -f /etc/logrotate.d/nginx-qj-push
相关推荐
闲云一鹤13 小时前
nginx 快速入门教程 - 写给前端的你
前端·nginx·前端工程化
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean4 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩4 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
何中应4 天前
Nginx转发请求错误
前端·后端·nginx
海天鹰4 天前
【免费】PHP主机=域名+解析+主机
服务器
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅4 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒4 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器