国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

淺析nginx 客戶端返回499的錯誤碼的問題

瀏覽:109日期:2023-03-13 15:37:26
目錄
  • 網(wǎng)絡(luò)架構(gòu)和背景
  • 上游服務(wù)抓包
  • 負載均衡的問題?
  • 修改配置 Nginx的配置

我們服務(wù)器客戶端一直有返回錯誤碼499的日志,以前覺得比例不高,就沒有仔細查過,最近有領(lǐng)導(dǎo)問這個問題,為什么耗時只有0.0幾秒,為啥還499了?最近幾天就把這個問題跟蹤定位了一下,這里做個記錄

網(wǎng)絡(luò)架構(gòu)和背景

我們服務(wù)架構(gòu)和錯誤碼是上面這樣的,上游服務(wù)日志沒有記錄,無法確定kong到上游服務(wù)的連接和請求細節(jié)。

kong上的日志rsp_cost:0.041rsp_length:0rsp_status:499ups_rsp_cost:-ups_rsp_length:0ups_rsp_status:-
waf上的日志rsp_cost:1.045rsp_length:0rsp_status:499ups_rsp_cost:-ups_rsp_length:0ups_rsp_status:-

看日志,兩個負載均衡的現(xiàn)象一毛一樣,kong upstream到web服務(wù)上,不太確定是upstream 鏈接的問題或者是讀寫數(shù)據(jù)的問題,或者是kong自己的問題,根本就沒有反向代理到上游服務(wù)

上游服務(wù)抓包

打算在上游服務(wù)上抓一下包,看看請求是在kong上出問題了,根本沒到上游服務(wù),還是說已經(jīng)到了上游服務(wù),上游服務(wù)出問題了。

83是kong的ip,82是上游服務(wù)的ip
可以看到,83首先發(fā)了fin包,表示要斷開連接,之后82也回復(fù)了fin的ack包,之后82還在發(fā)送數(shù)據(jù)包,過了大概0.18秒,82才給83發(fā)了fin ack包,表示可以斷開連接了。這時候由于83早就斷開了連接,在這個中間的包,83回復(fù)了RST,我們使用的是長鏈接,83斷開連接之后,新的連接已經(jīng)復(fù)用這個TCP連接了,這時候83只能回復(fù)RST。大概過程就是這樣的。

kong為什么要斷開連接?
由于我們使用upstream是長鏈接,猜測了很多種可能

  • keepalive_requests 超過keepalive_requests個請求后就會關(guān)閉長鏈接
  • keepalive_time 超過keepalive_time時間后就會關(guān)閉長鏈接
  • keepalive_timeout 打開上游服務(wù)的超時時間,連接超過keepalive_timeout就認為上游服務(wù)已經(jīng)不可用了,這個參數(shù)就直接排除了,抓包已經(jīng)看到請求已經(jīng)到了上游服務(wù)

最后都放棄了這個配置,覺得Nginx應(yīng)該會處理完請求之后再受到keepalive_requests keepalive_time的限制關(guān)閉連接,不可能請求處理一半然后直接主動關(guān)閉連接,還有一個原因,我們的Nginx版本是1.13,也沒有這些配置可以修改。

負載均衡的問題?

最后懷疑是waf上的問題,waf上請求量太大,沒去waf機器上抓包,猜測waf抓包跟kong的結(jié)果是一樣的,然后向前推測waf為什么要斷開連接,猜測是不是客戶端斷開了連接,如果是客戶端斷開連接的話,所有的看到的日志現(xiàn)象就是通的。
為了驗證這個猜測,我們在測試環(huán)境模擬了一下客戶端主動斷開連接的操作。
我們先在的上游服務(wù)上模擬了一個耗時的請求,然后再沒有返回結(jié)果的時候主動斷開請求。

class TestController extends BaseController{    public function actionTest()    {sleep(3);return $this->response->success(array("test","geekbang","es"));    }}

然后我們在終端上使用curl請求接口,在三秒之內(nèi)取消請求。
curl https://test.com/test/test/testctrl+C 取消請求
然后觀察waf的日志,以及kong的日志,跟生產(chǎn)出現(xiàn)的499錯誤碼表現(xiàn)是一樣的。
基本上確定是客戶端主動斷開連接引起的。

修改配置 Nginx的配置

看一下proxy_ignore_client_abort說明

Syntax:	proxy_ignore_client_abort on | off;Default:	proxy_ignore_client_abort off;Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.

確定當客戶端在不等待響應(yīng)的情況下關(guān)閉連接時,是否應(yīng)該關(guān)閉與代理服務(wù)器的連接。
客戶端不等待響應(yīng)關(guān)閉連接時,默認會關(guān)閉與代理服務(wù)器的連接,改為on就是代理服務(wù)器不關(guān)閉,直到代理服務(wù)器處理完請求。
在kong上修改配置
proxy_ignore_client_abort on
改了一臺機器,觀察了一天,確定了是因為這個配置,后面把兩臺機器都改了之后就沒有再出現(xiàn)499的錯誤碼。修改了這個配置之后,盡管錯誤碼消失了,但是無效的請求會增加上游服務(wù)的壓力,本來這個請求已經(jīng)無意義被客戶端關(guān)閉了,然后上游服務(wù)也被關(guān)閉了。打開之后,上游服務(wù)不會被關(guān)閉,直到請求處理完畢,有利有弊,需要權(quán)衡和取舍。

到此這篇關(guān)于nginx 客戶端返回499的錯誤碼的文章就介紹到這了,更多相關(guān)nginx返回499錯誤碼內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標簽: Nginx
主站蜘蛛池模板: 宁陕县| 秭归县| 岫岩| 棋牌| 米脂县| 淮阳县| 宁陵县| 临西县| 三河市| 新绛县| 广饶县| 宿迁市| 田东县| 裕民县| 南康市| 花垣县| 乌兰察布市| 缙云县| 江永县| 定结县| 扎赉特旗| 芜湖县| 湖北省| 乌拉特后旗| 九江县| 新余市| 科技| 射洪县| 阜新市| 开江县| 临武县| 哈巴河县| 深州市| 繁昌县| 南投市| 盐山县| 海门市| 上饶市| 浏阳市| 富阳市| 赤峰市|