日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

服务器排障 之 nginx 499 错误的解决

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 服务器排障 之 nginx 499 错误的解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:
Nginx 服務器大量499報錯

220.181.165.136 - - [18/May/2015:10:31:02 +0800] "POST /v1/jobsHTTP/1.1" 499 0 "" "bdHttpRequest/1.0.0"115.239.212.7 - - [18/May/2015:10:31:03 +0800] "GET /v1/job/643309e3-dc73-4025-aa69-c9405c1d818fHTTP/1.1" 499 0"http://www.baidu.com/?tn=91638679_hao_pg&s_j=1""Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"140.207.202.187 - - [18/May/2015:10:30:58 +0800] "POST/v3/violations HTTP/1.1" 499 0 "-" "-"42.236.10.71 - - [18/May/2015:10:30:59 +0800] "POST /v3/violationsHTTP/1.1" 499 0 "-" "-"106.120.173.17 - - [18/May/2015:10:30:58 +0800] "POST/v3/violations HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131Safari/537.36"180.97.35.164 - - [18/May/2015:10:30:52 +0800] "GET/v1/job/f86bdecc-2a61-4a42-bb7b-aa794b77f89b HTTP/1.1" 499 0"http://www.baidu.com/s?word=%E5%8D%81%E5%A0%B0%E5%A4%A9%E6%B0%94&tn=sitehao123&ie=utf-8""Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

問題分析:
1 499出現的原因
google定義:
499 / ClientClosed Request
An Nginx HTTP server extension. This codeis introduced to log the case when the connection is closed by client whileHTTP server is processing its request, making server unable to send the HTTP header back
維基百科定義:
499Client Closed Request (Nginx)
Used in Nginx logs to indicate when the connection has been closed by client while the server is still processing itsrequest, making server unable to send a status code back
Nginx源碼:
grep一下nginx源碼,定義在ngx_request_t.h :

/* * HTTP does notdefine the code for the case when a client closed * the connectionwhile we are processing its request so we introduce * own code to logsuch situation when a client has closed the connection * before we even tryto send the HTTP header to it */

#define NGX_HTTP_CLIENT_CLOSED_REQUEST 499
這是nginx定義的一個狀態碼,用于表示這樣的錯誤:服務器返回http頭之前,客戶端就提前關閉了http連接
繼續grep :
wKioL1ZK_oWDZn9NAAC_HrhuQAs422.png

這很有可能是因為服務器端處理的時間過長,客戶端“不耐煩”了。
要解決此問題,就需要在程序上面做些優化了。

再grep下“NGX_HTTP_CLIENT_CLOSED_REQUEST”,發現目前這個狀態值只在ngx_upstream中賦值

upstream在以下幾種情況下會返回499:

1)upstream 在收到讀寫事件處理之前時,會檢查連接是否可用: ngx_http_upstream_check_broken_connection,if (c->error) { //connecttion錯誤……if (!u->cacheable) { //upstream的cacheable為false,這個值跟http_cache模塊的設置有關。指示內容是否緩存。ngx_http_upstream_finalize_request(r, u, NGX_HTTP_CLIENT_CLOSED_REQUEST);} }

如上代碼,當連接錯誤時會返回499。
(2)server處理請求未結束,而client提前關閉了連接,此時也會返回499。
(3)在一個upstream出錯,執行next_upstream時也會判斷連接是否可用,不可用則返回499。
總之,這個錯誤的比例升高可能表明服務器upstream處理過慢,導致用戶提前關閉連接。而正常情況下有一個小比例是正常的。
繼續分析:
問題的核心就是要排查為什么服務端處理時間過長
可能問題:
1 后臺python程序處理請求時間過長
2 mysql慢查詢
通過查看監控:
1 cpu和內存的使用,都在正常范圍
2 后臺程序訪問正常
3 MySQL沒有慢查詢

結果:
經過詢問老大后得知,這個nginx為查詢違章的api,用戶提交查詢后, python就去數據庫或者交通局的網站查詢。這個查詢會有消耗一定的時間,所以,用戶會主動斷開連接
解決問題:
proxy_ignore_client_abort on; #讓代理服務端不要主動關閉客戶端的連接。

默認 proxy_ignore_client_abort 是關閉的,此時在請求過程中如果客戶端端主動關閉請求或者客戶端網絡斷掉,那么 Nginx 會記錄 499,同時 request_time 是「后端已經處理」的時間,而upstream_response_time 為“-“ (已驗證)。

如果使用了 proxy_ignore_client_abort on ;
那么客戶端主動斷掉連接之后,Nginx 會等待后端處理完(或者超時),然后記錄「后端的返回信息」到日志。所以,如果后端返回 200,就記錄 200 ;如果后端放回 5XX ,那么就記錄 5XX 。
如果超時(默認60s,可以用 proxy_read_timeout 設置),Nginx 會主動斷開連接,記錄 504
注:只在做反向代理的時候加入,作為其他服務器的時候,關閉為好,默認設置是關閉的!



? ? ? 本文轉自Tenderrain 51CTO博客,原文鏈接:http://blog.51cto.com/tenderrain/2045110,如需轉載請自行聯系原作者


總結

以上是生活随笔為你收集整理的服务器排障 之 nginx 499 错误的解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。