Tal*_*boy 1 connection http go
我将CloudFlare用于我的一个高容量网站,它位于我的堆栈前面.
事情是CloudFlare除了创建新的连接外,还会打开空闲连接,这不是我可以改变的设置.
当我让Varnish或Nginx坐在前面侦听端口80时,他们已经开箱即用配置来挂断空闲连接.
这很好,直到我必须添加一个用Go编写的代理到我的堆栈前面.它使用net/http标准库.
我不是Go向导,但基于人们告诉我的只有读取和写入超时设置但不挂空闲连接.
现在我的服务器将填满连接和死亡,除非我设置一组读取和写入超时,但问题是我的后端有时需要很长时间,并且它导致好的请求被切断,当他们不应该.
使用Go http处理空闲连接的正确方法是什么?
编辑1:为了更清楚,我正在httputil.NewSingleHostReverseProxy构建一个代理,它公开了传输选项,但仅用于上游.我遇到的问题是下游问题,需要在http.Server使用ReverseProxy作为处理程序的对象上设置它们.http.Server不暴露运输.
编辑2:我希望空闲超时到读取超时,因为后者将应用于活动上传器.
谢谢
在Go http服务器中挂起空闲连接的正确方法是设置读取超时.
没有必要将写入超时设置为挂起在空闲客户端上.如果它正在切断响应,请不要设置此值或进行调整.
如果您上传时间很长,请使用连接状态回调来实现单独的空闲和读取超时:
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)
}
}
Run Code Online (Sandbox Code Playgroud)