我对配置为代理服务器并具有指令的 Apache Web 服务器的行为有一个一般性疑问代理超时为了测试目的,设置为1秒。
我的后端(upsteam)服务器是一个 Python 内置的 HTTP 服务器,它故意等待超过 1 秒的时间才将响应发送到代理服务器(上面提到的 Apache),并在收到请求 3 秒后发送。
根据 Apache 官方文档(https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxytimeout)
代理应等待后端服务器的响应,等待时间在代理超时指令,如果没有响应,它必须“返回超时”,据我所知,这是一个状态代码 504,因为这个状态代码的规范是这样的:
504 网关超时 - 服务器充当网关或代理,未收到上游服务器的及时响应。
然而,当我向代理服务器发送请求时,它返回错误代码 502,这表明代理从上游服务器收到了无效的响应。
所以我试着去理解为什么会发生这种情况。为什么上游服务器没有问题,但状态码却是 502 而不是 504,只是因为超时而无法响应服务器?
Apache 的错误日志正确告知:
[proxy_http:error] [pid 6040] (70007)The timeout specified has expired: [client 192.168.56.1:53331] AH01102: error reading status line from remote server 127.0.0.1:8080"
上游后端服务器抛出了 BrokenPipeError,我将其捕获到一个异常并且没有让它崩溃,所以据我所知这不应该是服务器的故障,而是预期的行为,因为连接在 1 秒后关闭并且没有地方可以发送它。
也许有人可以帮助我理解这种行为的原因以及原因代理超时不会让 Apache 返回 504,根据文档这是否合乎逻辑?
提前致谢!