簡體   English   中英

go 似乎不支持持久連接設置

[英]go doesn't seem to honor persistent connections setting

我有一個使用 go 構建的反向代理。 我已將其設置為使用持久連接。 但是,當我在我的機器上監視打開的連接(使用 lsof -i)時,盡管我將它設置為 60 分鍾,但它看起來就像在幾分鍾內關閉了連接。

如果我在下面的設置中設置了其他超時,比如 ResponseHeaderTimeout,那么這些超時就會被兌現。

    myProxy.Transport = &transport{&http.Transport{
        Proxy: http.ProxyFromEnvironment,
        DialContext: (&net.Dialer{
            Timeout: 200 * time.Millisecond,
        }).DialContext,
        MaxIdleConns:          0,                       //no limit
        MaxIdleConnsPerHost:   10,
        IdleConnTimeout:       60 * time.Minute, 
    }}

http.Transport 中的空閑連接依賴於 HTTP 保持活動,如http.Transport 文檔中所述。 這些設置由傳輸使用,同時與對等方交換 http 有效負載(通過添加適當的保持活動標頭)。

話雖如此,HTTP keep-alive 必須由交換雙方(客戶端和服務器)同意。 大多數服務器限制打開連接的最大數量和保持活動請求的打開連接的持續時間(超時)。 這樣做是為了避免潛在的 DOS 攻擊,並在服務器上的系統資源有限的情況下為所有消費者提供公平的機會(每個保持活動連接都會增加服務器的開銷)。

60 分鍾的空閑超時太高了,我懷疑任何服務器都會遵守這一點(除非您也控制另一端的服務器配置)。 通常,這會保持在幾秒鍾內,以便為單個 HTTP 頁面及其所有資源(css、js、圖像)提供足夠的時間來使用單個連接從服務器加載。 一旦頁面加載成功,就沒有理由在一般瀏覽世界中保持連接打開。 Apache HTTPD 默認保持KeepAliveTimeout為 5 秒。

同樣值得注意的是,正如Mozilla Keep-Alive 文檔中明確指出的那樣,如果在傳輸級別沒有設置保持活動 TCP 消息,則可以忽略超過 TCP 超時的超時。

鑒於所有這些事實,您看到所看到的內容是絕對正常的(連接被自動關閉)。 傳輸將在需要時自動啟動新連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM