小编典典

在Go中创建空闲超时?

go

我将CloudFlare用于我的一个高流量网站,它位于堆栈的前面。

关键是CloudFlare除了创建新的连接之外,还保留空闲连接,这不是我可以更改的设置。

当我让Varnish或Nginx坐在前面监听端口80时,它们具有开箱即用的配置来挂断空闲连接。

很好,直到我必须将用Go编写的代理添加到堆栈的最前面。它使用net/http标准库。

我不是Go向导,而是根据人们告诉我的内容,只有读写超时设置,而不挂断空闲连接。

现在,除非设置了设置的读取和写入超时,否则我的服务器将填满连接并终止,但是问题是我的后端有时会花费很长时间,这会导致良好的请求在不应该的时候被切断。

使用Go http处理空闲连接的正确方法是什么?

编辑1:
更清楚地说,我httputil.NewSingleHostReverseProxy用来构造代理,该代理公开传输选项,但仅针对上游。我遇到的问题是下游的,需要在http.Server使用ReverseProxy作为处理程序的对象上进行设置。http.Server不暴露运输。

编辑2: 与读超时相比,我更喜欢空闲超时,因为后者将适用于活动上载器。

谢谢


阅读 206

收藏
2020-07-02

共1个答案

小编典典

在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)
    }
}
2020-07-02