我在 go 中運行 https Web 服務器。我正在使用對 Web 服務器進行 ajax 調用的 angular Web 應用程序(Chrome 瀏覽器)對其進行測試。如果我不斷地訪問網絡服務器,一切似乎都在工作。但是每當我讓它閑置一段時間并點擊 Web 服務器時,來自瀏覽器的 ajax 調用都沒有得到響應。我幾乎總是在我的服務器日志中看到這個日志行。2016/01/16 04:06:47.006977 http: TLS handshake error from 42.21.139.47:51463: EOF我可以確認IP地址是我的IP地址。我正在像這樣啟動我的 https 服務器:r := mux.NewRouter()r.HandleFunc("/status", handleStatus)setUpLoginEndpoint(&cfg.Session, r)setUpLogoutEndpoint(cfg.Session.CookieName, r)setUpChangePasswordEndpoint(cfg.Session.CookieName, r)setUpMetricSinkEndpoint(cfg.Metric.SinkApiKey, r)setUpMetricQueryEndpoint(cfg.Session.CookieName, r)http.ListenAndServeTLS(":443", "../cert.pem", "../keys.pem", &Server{r})我可以確認我正在使用 defer r.Body.Close() 關閉每個處理程序中的請求正文。我正在使用 go 1.5.2。
2 回答

慕勒3428872
TA貢獻1848條經驗 獲得超6個贊
我啟用了 tcp keepalive,這個問題就解決了。我在谷歌計算引擎中運行我的虛擬機,可能防火墻終止了空閑連接。
Golang http 服務器自動選擇了這一點,所以我的 golang 代碼不需要更改。
問候,
沙迪亞

鳳凰求蠱
TA貢獻1825條經驗 獲得超4個贊
我收到與 OP 相同的錯誤,但就我而言,我指定的 TLSHandshakeTimeout 值太低。我不確定什么是合適的值,但將它從 100ms 移到 700ms 消除了我的錯誤。對于遇到相同錯誤并在其 http.Client 設置中指定非默認 http.Transport 配置值的其他人,您可能需要確保將 TLSHandshakeTimeout 設置為足夠高的值。
&http.Client{
Transport: &http.Transport{
TLSHandshakeTimeout: 700 * time.Millisecond, //<-- I was receiving OP's error when I had this set to 100ms
}
}
- 2 回答
- 0 關注
- 425 瀏覽
添加回答
舉報
0/150
提交
取消