我將 CloudFlare 用于我的一個高容量網站,它位于我的堆棧前面。問題是 CloudFlare 除了創(chuàng)建新連接外還保持空閑連接打開,這不是我可以更改的設置。當我讓 Varnish 或 Nginx 坐在前面監(jiān)聽端口 80 時,它們具有開箱即用的配置來掛斷空閑連接。這很好,直到我不得不在我的堆棧前面添加一個用 Go 編寫的代理。它使用net/http標準庫。我不是 Go 向導,但根據人們告訴我的內容,只有讀取和寫入超時設置,但不會掛斷空閑連接。現(xiàn)在我的服務器將充滿連接并死亡,除非我設置了設置的讀取和寫入超時,但問題是我的后端有時需要很長時間,并且導致良好的請求在不應該被切斷時被切斷。使用 Go http 處理空閑連接的正確方法是什么?編輯 1:更清楚地說,我正在使用httputil.NewSingleHostReverseProxy構建一個代理,它公開傳輸選項,但僅適用于上游。我遇到的問題是下游,需要在http.Server使用 ReverseProxy 作為處理程序的對象上設置它們。http.Server不暴露傳輸。編輯 2:我更喜歡空閑超時而不是讀取超時,因為后者適用于活動的上傳者。謝謝
2 回答

瀟湘沐
TA貢獻1816條經驗 獲得超6個贊
在 Go http 服務器中掛斷空閑連接的正確方法是設置讀取超時。
沒有必要設置寫超時來掛斷空閑客戶端。如果它會切斷響應,請不要設置或調整此值。
如果你有很長的上傳,那么使用連接狀態(tài)回調來實現(xiàn)單獨的空閑和讀取超時:
server.ConnState = func(c net.Conn, cs http.ConnState) {
switch cs {
case http.StateIdle, http.StateNew:
c.SetReadDeadline(time.Now() + idleTimeout)
case http.StateActive:
c.SetReadDeadline(time.Now() + activeTimeout)
}
}
- 2 回答
- 0 關注
- 199 瀏覽
添加回答
舉報
0/150
提交
取消