Linux服務(wù)器nginx訪問日志里出現(xiàn)大量http 400錯誤的請求分析
服務(wù)器中的錯誤記錄類似于這種:
124.65.133.242 – – [27/Oct/2014:14:30:51 +0800] “-” 400 0 “-” “-”
124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] “-” 400 0 “-” “-”
124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] “-” 400 0 “-” “-”
124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] “-” 400 0 “-” “-”
踩點(diǎn)
經(jīng)過分析nginx的log文件,發(fā)現(xiàn)都是在一次正常訪問之后產(chǎn)生的數(shù)個400錯誤,每次有大概連續(xù)出現(xiàn)1-6個不等,而且也并不是每次客戶訪問都會產(chǎn)生400錯誤。
再觀察產(chǎn)生400錯誤的前一次訪問是很正常的,200狀態(tài)碼,正常的文件,正常的來路,正常的User-Agent… 一切都很和諧,那400是腫么來的呢?
通過仔細(xì)觀察發(fā)現(xiàn),所有產(chǎn)生400錯誤的前一次訪問的User-Agent都是Google Chrome瀏覽器留下的,也就是說400錯誤是由Chrome瀏覽器產(chǎn)生的。但是經(jīng)過本地抓包發(fā)現(xiàn),chrome是沒有向服務(wù)器發(fā)送異常請求或者數(shù)據(jù)包的。
在抓包分析中發(fā)現(xiàn),Chrome在訪問服務(wù)器時發(fā)起的連接不止一個,一般有5到6個不等,而如果請求的資源不需要那么多連接時,Chrome就會關(guān)閉未用的連接,這項技術(shù)叫做pre-connection“預(yù)先連接”。
通常我們訪問一個網(wǎng)站時,第一個獲取的是一個html主文件,而里面鏈接了網(wǎng)頁所需要的css、js、圖片等其他媒體資源文件,而一般資源文件和主 html文件是在一個域下的,預(yù)先連接就是在獲取html之前就建立很多的tcp連接,而不是等到獲取到html文件之后再去連接服務(wù)器獲取其他的文件, 因為連接服務(wù)器是需要消耗一些時間的,所以這項技術(shù)可以很大程度上加快網(wǎng)頁的呈現(xiàn)速度。
如果網(wǎng)頁html鏈接的資源比較少,或者客戶端有緩存,不需要連接下載,那么Chrome瀏覽器發(fā)出的5-6個連接很可能只有1個是需要的,其他的 都得關(guān)閉掉,這樣就產(chǎn)生了一個問題:連接了服務(wù)器,而沒有發(fā)送任何請求。對于這種情況,nginx是當(dāng)做400錯誤來處理的,但由于連接已經(jīng)關(guān)閉,錯誤信 息不會發(fā)送到客戶端,這就產(chǎn)生了日志文件中記錄了錯誤,而抓包分析中什么也看不到的現(xiàn)象。
測試
要驗證上面的分析結(jié)果很簡單,打開命令行cmd.exe,在里面輸入telnet serverip 80,等待連接成功之后直接關(guān)掉cmd,這時去查看nginx的log文件中就多了一條400錯誤記錄。
一句評論
pre-connection的優(yōu)點(diǎn)已經(jīng)很清楚了,但是它也是有缺點(diǎn)的,如果站長做了優(yōu)化,使用了Cookie-free技術(shù),或者網(wǎng)頁和靜態(tài)資源 使用不同的服務(wù)器,那么網(wǎng)頁需要的css、js資源就和主html不在同一個域下,也可能不在同一個IP上,那么pre-connection不僅是雞 肋,而且會對主html服務(wù)器產(chǎn)生不必要的負(fù)擔(dān)。
其它原因
網(wǎng)上很多人寫過相關(guān)的文章,大多的人的原因是因為 header 的頭部大小超了,引起響應(yīng) 400 告訴是 bad request.但其實(shí)還有一種可能,就是象端口測試工具,只是檢查端口是否是活的。像 LVS 之類什么的,也會引起這種問題,然后日志中會出現(xiàn)大量的 400 錯誤。
對于上述問題可以在nginx.conf中,將client_header_buffer_size和large_client_header_buffers都調(diào)大,可緩解此問題。
相關(guān)文章
13個實(shí)用的Apache Rewrite重寫規(guī)則
這篇文章主要介紹了13個實(shí)用的Apache Rewrite重寫規(guī)則,需要的朋友可以參考下2014-03-03記一次linux服務(wù)器入侵應(yīng)急響應(yīng)(小結(jié))
這篇文章主要介紹了記一次linux服務(wù)器入侵應(yīng)急響應(yīng),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-08-08Nginx+PHP+MySQL雙機(jī)互備、全自動切換方案
在生產(chǎn)應(yīng)用中,某臺“Nginx+PHP+MySQL”接口數(shù)據(jù)服務(wù)器,扮演的角色十分重要,如果服務(wù)器硬件或Nginx、MySQL發(fā)生故障,而短時間內(nèi)無法恢復(fù),后果將非常嚴(yán)重。為了避免單點(diǎn)故障,我設(shè)計了此套方案,編寫了failover.sh腳本,實(shí)現(xiàn)了雙機(jī)互備、全自動切換,故障轉(zhuǎn)移時間只需幾十秒。2008-12-12利用.htaccess的Rewrite規(guī)則實(shí)現(xiàn)Discuz論壇的偽靜態(tài)鏈接
重新開放了Minidx幫助論壇,雖然目前沒什么內(nèi)容,不過順便想SEO一下,實(shí)現(xiàn)偽靜態(tài)鏈接。2010-12-12Linux下SFTP用戶權(quán)限設(shè)置條件及實(shí)現(xiàn)命令
SFTP賬號是基于SSH賬號的,其擁有的權(quán)限是比較大的,今天主要教大家如何進(jìn)行SFTP用戶權(quán)限設(shè)置,感興趣的你可不要錯過了哈,希望本文知識可以幫助到你2013-02-02CentOS7環(huán)境搭建python3以及與python2實(shí)現(xiàn)共存的方法
這篇文章主要介紹了CentOS7環(huán)境搭建python3以及與python2實(shí)現(xiàn)共存的方法,結(jié)合實(shí)例形式簡單分析了CentOS7環(huán)境下安裝Python3的步驟、命令及測試代碼示例,非常簡單易懂,需要的朋友可以參考下2018-06-06使用CentOS7上的GitLab Runner,讓你的項目加速奔跑
本文介紹了在CentOS7上搭建和配置GitLabRunner的步驟,包括安裝前提、下載安裝、注冊到GitLab服務(wù)器、配置Runner執(zhí)行器以及高級配置等,通過這些步驟,可以實(shí)現(xiàn)代碼的快速、可靠構(gòu)建和部署2024-11-11