在Go中创建空闲超时?

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:我希望空闲超时到读取超时,因为后者将应用于活动上传器.

谢谢

Cer*_*món 5

在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)