成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記錄一次windows server上,反向代理服務(wù)器的配置和使用

alexnevsky / 3588人閱讀

摘要:無(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)題就解決了。

golang socket使用問(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

相關(guān)文章

  • 記錄一次windows server,反向代理務(wù)器配置使用

    摘要:無(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)求是...

    plus2047 評(píng)論0 收藏0
  • Nginx 最全小白實(shí)戰(zhàn)教程之二 (代理篇)

    摘要:客戶端必須要進(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)...

    sarva 評(píng)論0 收藏0
  • Nginx實(shí)踐篇(4)- Nginx代理服務(wù) - 正向代理反向代理

    摘要:一代理簡(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...

    Keven 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<