我将CloudFlare用于我的一个高流量网站,它位于堆栈的前面。
关键是CloudFlare除了创建新的连接之外,还保留空闲连接,这不是我可以更改的设置。
当我让Varnish或Nginx坐在前面监听端口80时,它们具有开箱即用的配置来挂断空闲连接。
很好,直到我必须将用Go编写的代理添加到堆栈的最前面。它使用net/http标准库。
net/http
我不是Go向导,而是根据人们告诉我的内容,只有读写超时设置,而不挂断空闲连接。
现在,除非设置了设置的读取和写入超时,否则我的服务器将填满连接并终止,但是问题是我的后端有时会花费很长时间,这会导致良好的请求在不应该的时候被切断。
使用Go http处理空闲连接的正确方法是什么?
编辑1: 更清楚地说,我httputil.NewSingleHostReverseProxy用来构造代理,该代理公开传输选项,但仅针对上游。我遇到的问题是下游的,需要在http.Server使用ReverseProxy作为处理程序的对象上进行设置。http.Server不暴露运输。
httputil.NewSingleHostReverseProxy
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) } }