Home > Mobile >  NGINX proxy pass for POST
NGINX proxy pass for POST

Time:02-24

I have two upstreams A and B running on ports 8301 and 8303 respectively. My intention is to put reverse proxy in front of them which passes request that failed on A to B.

I configured nginx like this

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;
        }

    }
}

When I run curl localhost:8300/xyz and A responds with 403 then nginx passes request to B. But this does not work with POST. curl -X POST localhost:8300/xyz returns 403 and there is no attempt for upstream B.

How do I configure nginx to proxy pass all request methods?

CodePudding user response:

When you utilise proxy_next_upstream and require request like POST, LOCK, PATCH to be retried you will need to configure your proxy_next_upsteam as such.

        proxy_next_upstream error http_403 non_idempotent;
        proxy_next_upstream error http_502 non_idempotent;

From the 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;
  • Related