接口服務(wù)在Nginx中提示HTTP 499問(wèn)題的排查步驟
1. 啟用 Nginx 的request_time日志
操作步驟:
- 編輯 Nginx 配置文件(通常是
/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf)。 - 在
http塊內(nèi)找到或添加log_format指令,自定義一個(gè)包含$request_time的格式。例如:
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
# 或者簡(jiǎn)單地在原有格式后追加 $request_time
access_log /var/log/nginx/access.log main;
}
- 保存配置后,執(zhí)行
nginx -t測(cè)試語(yǔ)法,然后nginx -s reload重載配置。 - 再次復(fù)現(xiàn)問(wèn)題,然后查看
access.log,應(yīng)該能看到每行末尾有rt=0.123這樣的記錄,這就是請(qǐng)求總耗時(shí)(單位:秒)。
解釋:
$request_time:從 Nginx 接收客戶端請(qǐng)求到發(fā)送完最后一個(gè)字節(jié)的總時(shí)間(包括與后端的通信)。$upstream_response_time:后端服務(wù)器處理請(qǐng)求的時(shí)間(從建立連接到收到響應(yīng)的時(shí)間)。如果這個(gè)值很大而$request_time接近,說(shuō)明后端處理慢;如果$upstream_response_time很小但$request_time很大,可能是網(wǎng)絡(luò)傳輸或客戶端接收慢。
2. 在沒(méi)有request_time時(shí)的替代排查方法
方法一:直接在后端應(yīng)用日志中查看處理耗時(shí)
你的后端服務(wù)(如 Java Spring Boot)通常會(huì)記錄每個(gè)請(qǐng)求的處理時(shí)間。例如:
- Spring Boot 的默認(rèn)日志格式可能包含耗時(shí)(
@ResponseBody等)。 - 你可以手動(dòng)在代碼中添加日志,輸出接口開(kāi)始和結(jié)束的時(shí)間戳,計(jì)算耗時(shí)。
- 對(duì)比“信貸信息”和“用戶信息”兩個(gè)請(qǐng)求的耗時(shí),看是否有明顯差異。
方法二:使用curl手動(dòng)測(cè)試接口耗時(shí)
在服務(wù)器上或另一臺(tái)機(jī)器上,用 curl 模擬兩個(gè)模塊的請(qǐng)求,觀察總耗時(shí):
# 模擬用戶信息模塊的請(qǐng)求
curl -o /dev/null -s -w "用戶信息耗時(shí): %{time_total}s\n" "http://你的后端IP:端口/video下載接口?參數(shù)=用戶信息的值"
# 模擬信貸信息模塊的請(qǐng)求
curl -o /dev/null -s -w "信貸信息耗時(shí): %{time_total}s\n" "http://你的后端IP:端口/video下載接口?參數(shù)=信貸信息的值"
比較兩者的耗時(shí)。如果用戶信息模塊的耗時(shí)遠(yuǎn)大于信貸模塊,說(shuō)明問(wèn)題在于該請(qǐng)求的處理本身就慢,導(dǎo)致客戶端超時(shí)。
方法三:檢查后端接口的實(shí)際處理時(shí)間(如果接口會(huì)生成壓縮包)
- 如果是動(dòng)態(tài)生成壓縮包,生成速度可能因文件數(shù)量、大小而異。
- 在代碼中記錄開(kāi)始生成壓縮包和完成的時(shí)間,看用戶信息模塊的請(qǐng)求是否生成了特別大的包,或者執(zhí)行了更耗時(shí)的邏輯。
3. 重點(diǎn)排查方向
由于 HTTP 499 是客戶端主動(dòng)斷開(kāi),結(jié)合“信貸模塊正常、用戶模塊 499”,重點(diǎn)檢查:
- 前端超時(shí)配置差異:確認(rèn)用戶信息模塊的請(qǐng)求是否設(shè)置了較短的
timeout(如 axios 的timeout: 3000030秒),而信貸模塊可能未設(shè)置或設(shè)置較長(zhǎng)。如果請(qǐng)求耗時(shí)超過(guò) 30 秒,前端就會(huì)斷開(kāi)。 - 請(qǐng)求參數(shù)導(dǎo)致的文件大小差異:用戶信息模塊下載的影像壓縮包可能遠(yuǎn)比信貸模塊的大。查看后端代碼,或者直接比較兩個(gè)模塊下載的壓縮包大小。
4. 在 Nginx 中增加upstream_response_time的監(jiān)控
如果不想修改全局日志格式,也可以臨時(shí)在特定的 location 或 server 塊中配置一個(gè)帶耗時(shí)的訪問(wèn)日志,例如:
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/api_access.log upstream_time;
location /your-download-api {
# ...
}
}
但更推薦統(tǒng)一配置以便長(zhǎng)期監(jiān)控。
以上就是接口服務(wù)在Nginx中提示HTTP 499問(wèn)題的排查步驟的詳細(xì)內(nèi)容,更多關(guān)于接口服務(wù)Nginx提示HTTP 499的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nginx 負(fù)載均衡 多站點(diǎn)共享Session
這里我們就 演練一下 以數(shù)據(jù)庫(kù)的形來(lái)存儲(chǔ)Session,來(lái)實(shí)現(xiàn)多站點(diǎn)共享Session2012-11-11
nginx 配置靜態(tài)緩存及靜態(tài)緩存文件沒(méi)有生成的問(wèn)題及解決方案
這篇文章主要介紹了nginx 配置靜態(tài)緩存及靜態(tài)緩存文件沒(méi)有生成的問(wèn)題及解決方案,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11

