帶寬異常的核心是識別高帶寬消耗的請求或來源,需結合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日志中的帶寬異常問題,同時通過長期監控和優化,預防類似問題再次發生。