Nginx 作为反向代理:如何正确配置网关超时?

5 nginx timeout reverse-proxy apache-2.2

我们已将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;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是 nginx 似乎将其误解为“尝试在一秒钟内从整个上游集群获得响应,如果我们不这样做,则会产生 50X 错误 - 对尝试任何上游服务器的时间没有任何限制”,其中显然不是我们的想法。

有什么办法可以让 nginx 做我们想做的事吗?

MrE*_*MrE 2

我认为你需要的是:

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错误 | 超时| 无效标题 | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | 非幂等 | 离开 ...; 默认值:proxy_next_upstream错误超时;

上下文:http、服务器、位置 指定在哪些情况下应将请求传递到下一个服务器:

错误

与服务器建立连接、向服务器传递请求或读取响应标头时发生错误;

暂停

与服务器建立连接、向服务器传递请求或读取响应标头时发生超时;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream