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