猿问

Golang - TLS 握手错误

我在 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。


一只甜甜圈
浏览 350回答 2
2回答

慕勒3428872

我启用了 tcp keepalive,这个问题就解决了。我在谷歌计算引擎中运行我的虚拟机,可能防火墙终止了空闲连接。TCP 保持活动状态在 linux 中配置 tcp 保持活动状态Golang http 服务器自动选择了这一点,所以我的 golang 代码不需要更改。问候,沙迪亚

凤凰求蛊

我收到与 OP 相同的错误,但就我而言,我指定的 TLSHandshakeTimeout 值太低。我不确定什么是合适的值,但将它从 100ms 移到 700ms 消除了我的错误。对于遇到相同错误并在其 http.Client 设置中指定非默认 http.Transport 配置值的其他人,您可能需要确保将 TLSHandshakeTimeout 设置为足够高的值。&http.Client{&nbsp; Transport: &http.Transport{&nbsp; &nbsp; TLSHandshakeTimeout:&nbsp; &nbsp;700 * time.Millisecond, //<-- I was receiving OP's error when I had this set to 100ms&nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答