nginx?http?499錯(cuò)誤碼詳解以及解決辦法
背景
499作為nginx自定義的狀態(tài)碼,不像400、401、500、502等常見(jiàn)的http狀態(tài)碼,很多不太常用nginx的人可能并不能清楚理解他的含義,本文將簡(jiǎn)單介紹一下499狀態(tài)碼的含義,以及出現(xiàn)后的排查和處理思路,以及proxy_ignore_client_abort參數(shù)是否能有效。
499是什么
nginx 對(duì)499的定義是 client has closed connection。這個(gè)定義比較模糊,簡(jiǎn)單來(lái)說(shuō)就是nginx在完成響應(yīng)之前客戶端斷開(kāi)了連接。
499是如何產(chǎn)生的
根據(jù)上面的定義,499產(chǎn)生的核心原因是客戶端在nginx完成響應(yīng)之前斷開(kāi)了連接??梢圆惶珖?yán)謹(jǐn)?shù)母爬ň褪?strong>nginx完成的響應(yīng)時(shí)間超過(guò)了客戶端的超時(shí)時(shí)間。
排查思路
上面對(duì)499產(chǎn)生原因的概括其實(shí)不太準(zhǔn)確,實(shí)際上造成499的原因有很多,接下來(lái)我就介紹主要的排查思路,以及我平時(shí)比較常見(jiàn)的幾種情況。
nginx作為火了很多年的高性能web服務(wù),有許多的應(yīng)用場(chǎng)景,我選擇比較常見(jiàn)的反向代理服務(wù)場(chǎng)景來(lái)介紹一下
在上述架構(gòu)下,客戶端發(fā)起一個(gè)請(qǐng)求大約要經(jīng)歷下面這些階段
這只是一個(gè)比較簡(jiǎn)單的流程,實(shí)際上會(huì)更復(fù)雜一些,比如中間可能還是一些網(wǎng)絡(luò)設(shè)備已經(jīng)其他的基礎(chǔ)服組件。
499的觸發(fā)時(shí)機(jī)
由于499是nginx記錄的狀態(tài)碼,所以客戶端斷開(kāi)連接的時(shí)機(jī)是要在nginx接收HTTP請(qǐng)求行,到nginx發(fā)送響應(yīng)這個(gè)區(qū)間內(nèi),所以如果客戶端在DNS解析或者TCP建連之前就超時(shí)的話是不會(huì)觸發(fā)499的,畢竟請(qǐng)求都沒(méi)有到達(dá)nginx。如果nginx已經(jīng)開(kāi)始返回響應(yīng)了,此時(shí)客戶端就斷開(kāi)連接的話,不會(huì)記錄499,會(huì)以響應(yīng)的狀態(tài)碼為準(zhǔn),比如200。
499的影響
上面說(shuō)過(guò),499代表客戶端超時(shí)斷開(kāi)了連接,大部分情況下499代表請(qǐng)求失敗了,需要根據(jù)業(yè)務(wù)場(chǎng)景評(píng)估影響。比如如果客戶端有重試邏輯, 499之后重試成功,那么實(shí)際上可能不會(huì)有很大的影響。
499還有一個(gè)比較容易被忽視的影響,由于499代表客戶端斷開(kāi)了連接,那么客戶端重試的時(shí)候意味著會(huì)重新建立tcp連接甚至重新tls握手,在一些高并發(fā)的場(chǎng)景下,大量的499導(dǎo)致的客戶端重試可能會(huì)對(duì)服務(wù)端造成一定的壓力,此時(shí)我們需要考慮在服務(wù)端做一些降級(jí)策略,減少499造成的重試壓力。
499的排查方向
我們之前提到過(guò),499觸發(fā)的根本原因是nginx返回的響應(yīng)時(shí)間超過(guò)了客戶端的超時(shí)時(shí)間,所以我們一般有下面幾個(gè)排查方向:
1. 后端響應(yīng)時(shí)間是否過(guò)長(zhǎng)
這里的后端是一個(gè)比較籠統(tǒng)的說(shuō)法,實(shí)際的后端邏輯中可能還包含數(shù)據(jù)庫(kù)的訪問(wèn)以及api的調(diào)用等,我們可以先通過(guò)查看nginx 499的訪問(wèn)日志中的upstream_response_time 字段確認(rèn)后端處理時(shí)間是否明顯增加,如果是的話可以再進(jìn)一步定位異常的環(huán)節(jié)。
2. nginx處理時(shí)間是否過(guò)長(zhǎng)
需要查看nginx服務(wù)器的負(fù)載,比如cpu idle,load,網(wǎng)卡流量,io等是否有明細(xì)的升高或不足, nginx一般作為統(tǒng)一的反向代理服務(wù),會(huì)代理多個(gè)域名,可以通過(guò)分析nginx請(qǐng)求日志,查看499的是否具有普遍性,如果在不同的域名,不同的后端服務(wù)中均有大量出現(xiàn)。配合之前說(shuō)的nginx負(fù)載問(wèn)題再進(jìn)一步深入定位。
3. 客戶端超時(shí)時(shí)間是否過(guò)短
這種情況需要看下nginx的499的request_time是否都比較短,且?guī)缀跸嗟龋枰タ纯蛻舳舜a中的調(diào)用的超時(shí)時(shí)間是否設(shè)置的不合理。
對(duì)相應(yīng)時(shí)間要求比較高的服務(wù)比較容易出現(xiàn)499,由于http協(xié)議的限制,客戶端想提前終止請(qǐng)求必須關(guān)閉連接,所以比較容易出現(xiàn)499。
4. 客戶端網(wǎng)絡(luò)質(zhì)量是否太差
這種情況服務(wù)端很難確認(rèn),需要有客戶端的訪問(wèn)日志或者使用一些撥測(cè)工具。
以上是一些比較簡(jiǎn)單的定位思路,沒(méi)涉及到一些性能問(wèn)題的排查方向,這個(gè)涉及到服務(wù)、網(wǎng)絡(luò)和操作系統(tǒng)等很多方向的內(nèi)容,這里不展開(kāi)詳談了。
此外網(wǎng)上還有個(gè)傳言是快速post的請(qǐng)求會(huì)導(dǎo)致觸發(fā)nginx 499 。但是這個(gè)說(shuō)法我從未找到具體的代碼支持和復(fù)現(xiàn),并且nginx是以性能著稱的web服務(wù),感覺(jué)不會(huì)有這種限制,個(gè)人傾向是以訛傳訛。
如何解決
通過(guò)上面的排查思路的介紹,我們其實(shí)可以發(fā)現(xiàn)產(chǎn)生499的原因有很多,核心解決思路就是增加客戶端的超時(shí)時(shí)間,加快后端的響應(yīng)速度,提供一些邊緣加速服務(wù)優(yōu)化客戶端的訪問(wèn)鏈路等等。但是499終究是一個(gè)客戶端行為,我們?cè)诜?wù)端側(cè)是很難完全解決的,根據(jù)業(yè)務(wù)場(chǎng)景的不同,可以自行評(píng)估499的重要程度,一般的業(yè)務(wù)場(chǎng)景少量偶發(fā)的499不需要特別關(guān)注。
proxy_ignore_client_abort 有用嗎?
然后就是簡(jiǎn)單聊一下 nginx的 proxy_ignore_client_abort 這個(gè)參數(shù)。nginx官方的解釋是:
Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.proxy_ignore_client_abort:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort
nginx默認(rèn)會(huì)在client關(guān)閉連接的時(shí)候,同時(shí)關(guān)閉nginx向上游服務(wù)(后端)的連接,這個(gè)參數(shù)開(kāi)啟后,nginx將不會(huì)同步關(guān)閉后端服務(wù)連接,后端服務(wù)完成響應(yīng)后,此次請(qǐng)求nginx也將不會(huì)記錄499狀態(tài)碼,而是記錄后端對(duì)應(yīng)的響應(yīng)狀態(tài)碼。
不知道從什么時(shí)候這個(gè)參數(shù)被傳為可以是“解決”499的方法,然后如果你閱讀了我上面寫(xiě)的內(nèi)容后,應(yīng)該會(huì)明白,這個(gè)參數(shù)不是解決499而是忽略499。并且一般我是不建議開(kāi)啟此參數(shù)的。主要有這幾個(gè)原因:
1. 修改了響應(yīng)的狀態(tài)碼,掩蓋異常請(qǐng)求
開(kāi)啟這個(gè)參數(shù)后nginx的請(qǐng)求日志便和客戶端的記錄不一致。比如如果客戶端已經(jīng)超時(shí),但是nignx這邊仍然記錄的一條200狀態(tài)碼的訪問(wèn)日志,這種后續(xù)問(wèn)題排查和定位的時(shí)候,可能會(huì)提高排查難度。并且掩蓋了499這一異常狀態(tài)碼,不利于及時(shí)發(fā)現(xiàn)異常。
2. ??????會(huì)浪費(fèi)后端資源
客戶端發(fā)起了一些很重的請(qǐng)求超時(shí)后,可能會(huì)不斷重試,開(kāi)啟此參數(shù)nginx則不會(huì)中斷之前向后端發(fā)起的請(qǐng)求,可能會(huì)導(dǎo)致加重對(duì)后端資源的使用。
所以proxy_ignore_client_abort并不是解決499的方法,大家一定要注意。
總結(jié)
499是由于nginx響應(yīng)完成前客戶端就斷開(kāi)了連接導(dǎo)致的,排查原因一般從客戶端網(wǎng)絡(luò)狀態(tài),超時(shí)時(shí)間以及服務(wù)端的響應(yīng)時(shí)間來(lái)排查。常見(jiàn)的業(yè)務(wù)場(chǎng)景下,少量的499其實(shí)不需要過(guò)多的關(guān)注。
proxy_ignore_client_abort可以忽略499,但不是解決方法,不建議大家開(kāi)啟。沒(méi)有證據(jù)能證明快速post導(dǎo)致nginx499,這個(gè)應(yīng)該是謠傳。
到此這篇關(guān)于nginx http 499錯(cuò)誤碼詳解以及解決辦法的文章就介紹到這了,更多相關(guān)nginx http 499錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx服務(wù)器中配置404錯(cuò)誤頁(yè)面時(shí)一些值得注意的地方
這篇文章主要介紹了Nginx服務(wù)器中配置404錯(cuò)誤頁(yè)面時(shí)一些值得注意的地方,包括隱藏Nginx出錯(cuò)頁(yè)面及Header上的版本號(hào)的安全方法,需要的朋友可以參考下2016-01-01nginx禁止訪問(wèn).git文件的設(shè)置教程
這篇文章主要介紹了nginx禁止訪問(wèn).git文件的設(shè)置教程,.git文件會(huì)包含一份文件列表,如果你的網(wǎng)站是基于git協(xié)作開(kāi)發(fā)的,則必須要注意這個(gè)問(wèn)題,需要的朋友可以參考下2014-08-08Nginx?Tomcat負(fù)載均衡動(dòng)靜分離原理解析
這篇文章主要為大家介紹了Nginx?Tomcat負(fù)載均衡動(dòng)靜分離原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Nginx反向代理在Web應(yīng)用中的實(shí)戰(zhàn)分享
本文將介紹Nginx反向代理的基本原理和配置,以及如何利用Nginx實(shí)現(xiàn)高可用性和故障轉(zhuǎn)移,最后,我們將探討如何監(jiān)控Nginx反向代理的性能并進(jìn)行日志分析,需要的朋友可以參考下2024-08-08Kubernetes之安裝nginx-controller作為統(tǒng)一網(wǎng)關(guān)方式
這篇文章主要介紹了Kubernetes之安裝nginx-controller作為統(tǒng)一網(wǎng)關(guān)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Nginx學(xué)習(xí)之如何搭建文件防盜鏈服務(wù)的方法示例
這篇文章主要介紹了Nginx學(xué)習(xí)之如何搭建文件防盜鏈服務(wù)的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10