【记录】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
相关推荐
heartbeat..2 小时前
Web 状态管理核心技术详解 + JWT 双 Token (Access/Refresh Token) 自动登录
java·网络·jwt·token
weixin_425023002 小时前
多内网服务器公网中转通信方案(Spring Boot 2.7 + MyBatis Plus)
服务器·spring boot·mybatis
EasyCVR2 小时前
视频汇聚平台EasyCVR构筑校园食堂全场景智慧监管新模式
网络·音视频
脏脏a2 小时前
【Linux】Linux 初探:历史溯源与常用指令速览
linux·运维·服务器·基础指令
I · T · LUCKYBOOM2 小时前
2.1编译安装--单台服务器托管多网站
linux·运维·服务器·网络
Howrun7772 小时前
Linux进程通信---3---System V 共享内存
linux·服务器
柏油2 小时前
WebSocket推送架构设计
网络·websocket·网络协议
代码游侠2 小时前
应用——SQLite3 C 编程学习
linux·服务器·c语言·数据库·笔记·网络协议·sqlite
水星灭绝2 小时前
测试http下载
网络·网络协议·http