带宽异常的核心是识别高带宽消耗的请求或来源,需结合Nginx日志(access_log为主)进行分析。
access_log包含$body_bytes_sent字段(表示发送给客户端的文件主体大小,是计算带宽的关键指标)。默认格式示例:$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"yum install goaccess),执行以下命令:goaccess /var/log/nginx/access.log -a -o report.html
生成的HTML报告中,Bandwidth板块会显示总带宽、请求分布及Top URL/Referer的带宽消耗。awk '{print $7, $10}' /var/log/nginx/access.log | sort -k2 -nr | head -20 # 按带宽排序Top20请求
awk '{print $1, $10}' /var/log/nginx/access.log | sort -k2 -nr | head -20 # 按带宽排序Top20 IP
根据定位结果,采取针对性优化:
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 6; # 压缩级别(1-9,越高压缩率越高,但CPU消耗越大)
gzip_min_length 1k; # 只压缩大于1KB的文件
}
expires和Cache-Control头,让浏览器缓存静态资源,减少重复请求:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 缓存30天
add_header Cache-Control "public, no-transform";
}
try_files指令错误返回首页(如搜索结果中提到的try_files $uri $uri/ /index.html导致不存在的CSS/JS返回首页),修正为:location / {
try_files $uri $uri/ =404; # 不存在的路径返回404,而非首页
}
map指令和if条件,拦截常见扫描工具(如python-requests、Wget):map $http_user_agent $is_bot {
default 0;
"~*(python|wget|curl|java)" 1;
}
server {
if ($is_bot) {
return 403; # 直接拒绝
}
}
limit_req模块限制单个IP的请求频率,防止恶意刷接口:http {
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; # 每秒10个请求
}
server {
location /api/ {
limit_req zone=req_limit_per_ip burst=20 nodelay; # 允许突发20个请求
proxy_pass http://backend;
}
}
deny指令或防火墙(如iptables)封禁高频异常IP:location / {
deny 192.168.1.100; # 直接拒绝指定IP
allow all;
}
或使用iptables:iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j DROP
proxy_cache缓存响应,减少后端压力:http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
}
server {
location /api/hot/ {
proxy_cache my_cache;
proxy_cache_key "$host$request_uri";
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_pass http://backend;
}
}
iftop(实时网卡流量)、nload(分协议流量)或Prometheus+Granafa(可视化监控)监控带宽使用情况,设置阈值告警(如带宽超过80%时触发邮件/短信通知)。通过以上流程,可快速定位并解决CentOS Nginx日志中的带宽异常问题,同时通过长期监控和优化,预防类似问题再次发生。