Nginx 作为缓存代理:如果第一个上游返回 404,则尝试第二个上游

Nginx 作为缓存代理:如果第一个上游返回 404,则尝试第二个上游

对于使用 nginx 作为缓存代理,有没有办法配置 2 个上游服务器,以便它总是尝试第一个服务器,除非该服务器返回 404,并且只有在这种情况下它才会尝试第二个上游?

我知道backup上游配置块中的选项,但只有在第一个服务器不可用时才会尝试该服务器。我说的是如果第一个服务器可用,但只是那个特定的请求文件返回 404。

答案1

我不确定你为什么想要超时或者说 50X 响应是有效的,但如果你真的只是想要 404,那么 Nginx 文档会这样解释:

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

max_fails=数字

设置在 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_proxy_module.html#proxy_next_upstream

语法:proxy_next_upstream 错误 | 超时 | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | 关闭...;

http_404 服务器返回代码为 404 的响应;

对类似帖子的回答可以作为您配置的基础:

https://stackoverflow.com/a/12878310/4995465

答案2

是的,您可以weight在上游组中增加一台服务器,并尝试proxy_next_upstream包含或排除您不想发生切换的代码。这样,权重较大的服务器将满足大多数请求(多数/少数取决于权重大小,但无论如何,某些请求将由第二个服务器满足)。

尽管如此,这仍然backup是正确的选择。我无法想象为什么不使用某个始终包含所有数据的服务器。

相关内容