【记录】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
相关推荐
消失的旧时光-194311 分钟前
Linux 入门核心命令清单(工程版)
linux·运维·服务器
艾莉丝努力练剑18 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Trouvaille ~44 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
liann1191 小时前
3.1_网络——基础
网络·安全·web安全·http·网络安全
独行soc1 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
辣香牛肉面1 小时前
Wireshark v4.6.2 开源免费网络嗅探抓包工具中文便携版
网络·测试工具·wireshark
全栈工程师修炼指南1 小时前
Nginx | stream 四层反向代理:SSL、PREREAD 阶段模块指令浅析与实践
运维·网络·网络协议·nginx·ssl
M158227690551 小时前
TCP转LORA产品说明及应用案例
网络·网络协议·tcp/ip
旖旎夜光1 小时前
Linux(13)(中)
linux·网络
来可电子CAN青年2 小时前
CAN总线远距离传输老断网?Fx灯不闪别慌,这几招让你的通信“稳如泰山”!
网络