POST 的 NGINX 代理通行证

NGINX proxy pass for POST

我有两个上游 A 和 B 运行ning 分别在端口 8301 和 8303 上。我的目的是将反向代理放在他们面前,将在 A 上失败的请求传递给 B。

我是这样配置nginx的

daemon off;
events {}

http {
    upstream api {
        server host.docker.internal:8301;
        server host.docker.internal:8303 backup;
    }

    server {
        listen 8300;
        location / {
            proxy_pass http://api;
            proxy_redirect off;
            proxy_intercept_errors on;
            proxy_next_upstream error http_403;
            proxy_next_upstream error http_502;
        }

    }
}

当我 运行 curl localhost:8300/xyz 并且 A 以 403 响应时,nginx 将请求传递给 B。但这不适用于 POST。 curl -X POST localhost:8300/xyz returns 403 并且没有尝试上游 B.

如何配置 nginx 以代理传递所有请求方法?

当您使用 proxy_next_upstream 并要求重试 POST、LOCK、PATCH 之类的请求时,您需要这样配置 proxy_next_upsteam。

        proxy_next_upstream error http_403 non_idempotent;
        proxy_next_upstream error http_502 non_idempotent;

来自Nginx Docs

non_idempotent
normally, requests with a non-idempotent method (POST, LOCK, PATCH) are not passed to the next server if a request has been sent to an upstream server (1.9.13); enabling this option explicitly allows retrying such requests;