如何为每个请求而不是全局配置 Squid 连接|读|写超时

How to configure Squid connection|read|write timeout per Request instead of Globally

设置

假设我有两个不同的 HTTP 客户端使用同一个 Squid 实例。

第一个客户端,名为 ClientA,具有激进的 Http read/write 和 5 秒的连接超时。另一个名为 ClientB 的客户端有一个非常放松的 120 秒超时。

我的 Squid 服务器配置如下所示:

connect_timeout 1 minute
read_timeout 1 minute
write_timeout 1 minute

场景一

ClientA 向 ServerX 发送请求(通过 Squid),该请求将在接受连接之前等待 45 秒,然后立即回复。

问题一

ClientA 将在 5 秒后超时,但 Squid 会注意到并关闭出站连接或等待 ServerX 响应(在 40~ 秒内)并且无法将结果写回不再监听的 ClientA ?

场景二

ClientB 向 ServerY 发送请求(通过 Squid),该请求将在接受连接之前等待 61 秒,然后立即回复。

问题二

ClientB 不会超时,但是 Squid 应该在 60 秒后超时并向 ClientB 发送一个 Http Timeout 408,对吗?

全局问题

有什么方法可以设置 Squid 以便我们可以通过请求而不是在服务级别全局设置超时?

重要说明:squid 关于超时的行为会根据所使用的协议而改变。在 HTTPS 的情况下,它无法检查隧道连接的 HTTP headers,因此它无法接受任何 ConnectionProxy-ConnectionKeep-Alive: timeout=xx 值。

场景一

Squid 会在发现客户端离开后立即关闭出站连接。

场景二

squid 确实会超时,但结果将取决于所使用的协议。在 HTTP 的情况下,它将 return “504 Gateway Time-out” 并添加一个额外的 header “X-Squid-Error: ERR_READ_TIMEOUT 0”。

对于 HTTPS,它只会关闭连接,因为它无法读取或注入对客户端有意义的 headers。

全局问题

不在 squid 配置本身中。如果你想 fine-grained 控制持久连接的超时,你应该在你的客户端中这样做。

作为记录,这里是 time-out 设置 squid 将尝试遵守持久连接:

客户端 <-> 鱿鱼: client_persistent_connections, persistent_request_timeout

鱿鱼<->服务器: server_persistent_connections、pconn_timeout、read_timeout(对于 HTTPS)