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

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

我们已经配置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

相关内容