我们已经配置Nginx作为 Apache 服务器场的反向代理,但我遇到了网关超时的问题。
我们的目标以人类可读的形式表达为:“在一秒钟内传递请求,但如果确实需要更长时间,则无论如何都要传递”,对我来说,这可以理解为“尝试上游的第一个 Apache 服务器,最长 500 毫秒。如果出现超时/错误,则尝试下一个,依此类推,直到最终成功。”
现在我们的相关配置是这样的:
location @proxy {
proxy_pass http://apache$request_uri;
proxy_connect_timeout 1s;
proxy_read_timeout 2s;
}
[...]
upstream apache {
server 127.0.0.1:8001 max_fails=1 fail_timeout=10s;
server 10.1.x.x:8001 max_fails=1 fail_timeout=10s backup;
server 10.1.x.x:8001 max_fails=1 fail_timeout=10s backup;
server 10.1.x.x:8001 max_fails=1 fail_timeout=10s backup;
}
这里的问题是,nginx 似乎误解了这一点“尝试在一秒钟内从整个上游集群获得响应,如果没有,则提供 50X 错误 - 并且对尝试任何上游服务器的时间没有任何限制”,这显然不是我们想要的。
有没有什么办法可以让 nginx 做我们想要做的事情?
答案1
我认为你需要的是:
max_fails=0
和
proxy_next_upstream = timeout
根据文档:
最大失败次数=数字
设置在 fail_timeout 参数设置的持续时间内应发生的与服务器通信失败尝试次数,以将服务器视为在同样由 fail_timeout 参数设置的持续时间内不可用。默认情况下,失败尝试次数设置为 1。零值禁用尝试计数。什么被视为失败尝试由 proxy_next_upstream、fastcgi_next_upstream、uwsgi_next_upstream、scgi_next_upstream 和 memcached_next_upstream 指令定义。
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
和:
句法: proxy_next_upstream错误 | 超时 | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | non_idempotent | 关闭 ...; 默认值:proxy_next_upstream 错误超时;
上下文:http、server、location 指定在哪些情况下应将请求传递到下一个服务器:
错误
与服务器建立连接、向服务器传递请求或读取响应标头时发生错误;
暂停
与服务器建立连接、向服务器传递请求或读取响应头时发生超时;
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream