摘要:無(wú)法形容,直接對(duì)產(chǎn)生了滿分好感于是直接打開(kāi)源碼目錄全局搜,找到,如下一段注釋掉了上面這些,跑起來(lái)沒(méi)有問(wèn)題,這樣的問(wèn)題就解決了。那么查一下,有說(shuō)設(shè)置注冊(cè)表的感覺(jué)并不是解決辦法實(shí)測(cè)也不能解決問(wèn)題。
背景
我司的軟件在一個(gè)客戶處測(cè)試功能和性能,這個(gè)客戶比較特殊:
他們客戶端是很舊的java代碼,且要求不能改動(dòng),客戶端的主要業(yè)務(wù)簡(jiǎn)單說(shuō)就是上傳下載文件
他們提供了客戶端demo,http請(qǐng)求是用裸socket手動(dòng)加http頭,寫死了http1.1,但又不帶host這個(gè)http頭
客戶要求中間必須經(jīng)過(guò)一臺(tái)windows server服務(wù)器代理
后端的實(shí)際服務(wù)器是linux系統(tǒng),用的是nginx
host header問(wèn)題(此時(shí)先直連后端服務(wù),不考慮代理)最開(kāi)始是請(qǐng)求直接返400,nginx access log可以看到400但是沒(méi)有更多信息,error log則沒(méi)有任何信息打印,一開(kāi)始另一位同事負(fù)責(zé)定位,我跟著一起用wireshark抓包看了很久,沒(méi)得出結(jié)論。后來(lái)我又看了一下,nginx error log默認(rèn)的日志級(jí)別是crit,那么直接改到debug,看到這個(gè)信息:
那么問(wèn)題就一目了然了,查了一下,這個(gè)header是http1.1要求必須帶的
且nginx嚴(yán)格遵守該協(xié)議,沒(méi)有提供可配置的方式忽略這個(gè)頭,如上圖按理說(shuō)服務(wù)端不應(yīng)該強(qiáng)行處理這種問(wèn)題,但客戶要求最高,沒(méi)辦法
這時(shí)候好在,正好我們需要一層反向代理,那么,看看能不能找一個(gè)允許不帶該header的反向代理服務(wù)器實(shí)現(xiàn),接下來(lái)可以暫時(shí)忽略這個(gè)問(wèn)題,我們使用壓測(cè)工具測(cè)性能,壓測(cè)工具在這個(gè)header上是沒(méi)有問(wèn)題的
代理布署及性能問(wèn)題windows server系統(tǒng)的服務(wù)器,一開(kāi)始我們直接用Nginx,但簡(jiǎn)單測(cè)后就知道性能很差,搜了一下基本是說(shuō)nginx和apache在windows上性能都沒(méi)啥希望,首推的基本還是微軟自家的IIS,于是我們配起了IIS,果然性能與直連后端相比基本沒(méi)有損耗,但是經(jīng)過(guò)很長(zhǎng)時(shí)間查資料,找不到配置忽略host header的方法,而且IIS的確不好用,配置比較難看懂,大家都不熟悉windows平臺(tái),接下來(lái)只能另辟蹊徑
python:老本行,用twisted寫了個(gè)4行的反向代理,性能不如nginx,大概只有直連的1/6,時(shí)間緊迫,沒(méi)來(lái)得及分析,繼續(xù)嘗試其他語(yǔ)言
nodejs:在github找到個(gè)redbird庫(kù),代碼也是只需要兩行,但性能跟python半斤八兩
java:撿了個(gè)undertow的框架,折騰挺久終于搞起來(lái),倒是基本沒(méi)有性能損耗,于是就要解決header問(wèn)題,但是這個(gè)版本的400返回沒(méi)帶提示信息,java框架源碼要反編譯看,倒也還好,但是沒(méi)有錯(cuò)誤信息,不好直接搜代碼,只能看流程,比較難看,java接觸的也少
go:代碼倒是長(zhǎng)一些,有三十來(lái)行,但是只用到了go的標(biāo)準(zhǔn)庫(kù),性能不出意外也是等于直連,驚喜的來(lái)了,它的400帶了個(gè)錯(cuò)誤信息提示:missing required Host header,當(dāng)時(shí)那個(gè)幸福感。。。無(wú)法形容,直接對(duì)go產(chǎn)生了滿分好感
于是直接打開(kāi)源碼目錄全局搜,找到src/net/http/server.go,如下一段
`
// hosts, haveHost := req.Header["Host"] isH2Upgrade := req.isH2Upgrade() // if req.ProtoAtLeast(1, 1) && (!haveHost || len(hosts) == 0) && !isH2Upgrade && req.Method != "CONNECT" { // return nil, badRequestError("missing required Host header") // } // if len(hosts) > 1 { // return nil, badRequestError("too many Host headers") // } // if len(hosts) == 1 && !httpguts.ValidHostHeader(hosts[0]) { // return nil, badRequestError("malformed Host header") // }
`
注釋掉了上面這些,跑起來(lái)沒(méi)有問(wèn)題,這樣host header的問(wèn)題就解決了。
但是到這還沒(méi)結(jié)束,壓測(cè)跑了一會(huì)兒發(fā)現(xiàn)請(qǐng)求全部失敗,看了一下報(bào)錯(cuò),socket爆了,在cmd里netstat查了一下,果然go進(jìn)程接近2w的socket消耗,全部是TIME_WAIT狀態(tài)
本端主動(dòng)關(guān)閉的socket,就會(huì)進(jìn)入TIME_WAIT狀態(tài),被對(duì)方關(guān)閉是CLOSE_WAIT。那么查一下windows socket time_wait,有說(shuō)設(shè)置注冊(cè)表的
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesTcpipParameters]
"TcpTimedWaitDelay"=dword:0000001e
感覺(jué)并不是解決辦法?實(shí)測(cè)也不能解決問(wèn)題。想想也知道關(guān)鍵應(yīng)該是找到為什么go會(huì)頻繁關(guān)閉socket,那么google的關(guān)鍵字就應(yīng)該是這樣了:go socket time_wait
搜索結(jié)果第一條stackoverflow的就是答案:https://stackoverflow.com/que...
在main函數(shù)里加上配置:
http.DefaultTransport.(*http.Transport).MaxIdleConns = 8192
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = 8192
這個(gè)值的含義見(jiàn)鏈接,簡(jiǎn)單說(shuō)就是允許保持的最大tcp連接數(shù),默認(rèn)值是2(待研究為什么要這樣默認(rèn)),超過(guò)后會(huì)一直關(guān)socket再重開(kāi),我們壓測(cè)工具跑的是100并發(fā),實(shí)際只需要這個(gè)值是200就夠了(因?yàn)橥鵵eal server的那個(gè)方向還需要同樣的連接數(shù) 所以*2)
想想python應(yīng)該也能做到無(wú)損耗的,twisted庫(kù)不知道有什么多余操作,有時(shí)間應(yīng)該裸寫一個(gè)反向代理看看。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73608.html
摘要:無(wú)法形容,直接對(duì)產(chǎn)生了滿分好感于是直接打開(kāi)源碼目錄全局搜,找到,如下一段注釋掉了上面這些,跑起來(lái)沒(méi)有問(wèn)題,這樣的問(wèn)題就解決了。那么查一下,有說(shuō)設(shè)置注冊(cè)表的感覺(jué)并不是解決辦法實(shí)測(cè)也不能解決問(wèn)題。 背景 我司的軟件在一個(gè)客戶處測(cè)試功能和性能,這個(gè)客戶比較特殊: 他們客戶端是很舊的java代碼,且要求不能改動(dòng),客戶端的主要業(yè)務(wù)簡(jiǎn)單說(shuō)就是上傳下載文件 他們提供了客戶端demo,http請(qǐng)求是...
摘要:客戶端必須要進(jìn)行一些特別的設(shè)置才能使用正向代理。正向代理還可以使用緩沖特性減少網(wǎng)絡(luò)使用率。反向代理的典型用途是將防火墻后面的服務(wù)器提供給用戶訪問(wèn)。反向代理對(duì)外都是透明的,訪問(wèn)者并不知道自己訪問(wèn)的是一個(gè)代理。 一、相關(guān)概念 代理一般分為正向代理和反向代理,以下是他們的定義(以下內(nèi)容引自網(wǎng)上) 正向代理,也就是傳說(shuō)中的代理,他的工作原理就像一個(gè)跳板,簡(jiǎn)單的說(shuō),我是一個(gè)用戶,我訪問(wèn)不了某網(wǎng)...
摘要:一代理簡(jiǎn)介代理代理服務(wù)正向代理和反向代理區(qū)別在于代理的對(duì)象不一樣。 一、代理簡(jiǎn)介 1. 代理 showImg(https://segmentfault.com/img/remote/1460000015873425?w=556&h=248); 2. Nginx代理服務(wù) showImg(https://segmentfault.com/img/remote/146000001587342...
閱讀 640·2021-11-22 15:32
閱讀 2726·2021-11-19 09:40
閱讀 2322·2021-11-17 09:33
閱讀 1280·2021-11-15 11:36
閱讀 1876·2021-10-11 10:59
閱讀 1487·2019-08-29 16:41
閱讀 1791·2019-08-29 13:45
閱讀 2161·2019-08-26 13:36