问题
最近发现有一个数据断了几天
- 尝试本地推送到 服务器,推送失败报错如下:
- 但是数据并不是完全中断,大多数图片数据都能顺利接收并覆盖
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>"
排查
- 最后排查磁盘空间发现是nginx日志爆满
- 导致部分请求失败 返回500
- 由于日志需要保存 半年以上,nginx默认每次接收请求记录一次
而接口数据推送 每分钟1k+次请求 -> 每天约144万条日志,半年可能还是会超出空间
plain
dh -f # 查看磁盘空间
du -sh /* | sort -hr # 查看目录下哪个文件夹占用最多



优化
- 由于主要接收一个数据接口的推送请求,故专门对改接口 的日志 单独进行极简配置
如下为 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;
}
# 。。。。 其余配置
}
}
如图,右侧则是针对单一接口配置的 单独日志文件

- 半年自动备份功能
使用 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
