web-dev-qa-db-fra.com

nginx proxy_pass sur la base de la méthode de la requête est post, mettre ou supprimer

J'ai deux ikaaro Instances exécutées sur le port 8080 et 9080, où l'instance 9080 est en lecture seule.

Je ne sais pas comment utiliser Nginx, par exemple, si la méthode de la requête est Post, Mettez, supprimer ensuite à l'instance d'écriture (8080) sinon envoie à 9080 instance.

J'ai fait quelque chose en utilisant l'emplacement à l'aide de la regex, mais cela n'est pas correct.

De http: //wiki.nginx.org/httpluamodule Je vois qu'il existe des "constantes de méthode http" qui peuvent être appelées, il est donc correct d'ajouter un bloc d'emplacement comme suit:

location ~* "(ngx.HTTP_POST|ngx.HTTP_DELETE|ngx.HTTP_PUT)" {
    proxy_pass http://127.0.0.1:8080;

Merci

22
khinester

Je viens de faire un test rapide et cela a travaillé pour moi:

server {
  location / {
    # This proxy_pass is used for requests that don't
    # match the limit_except
    proxy_pass http://127.0.0.1:8080;

    limit_except PUT POST DELETE {
      # For requests that *aren't* a PUT, POST, or DELETE,
      # pass to :9080
      proxy_pass http://127.0.0.1:9080;
    }
  }
}
36
kolbyjack

Je recommanderais la fonction Carte Nginx. Cela sort de votre bloc de localisation:

map $request_method $destination {
    default 8080;
    PUT 9080;
    POST 9080;
    DELETE 9080;
}

Ensuite, dans votre bloc d'emplacement:

proxy_pass http://127.0.0.1:$destination

C'est toutes des regexes aussi, afin que vous puissiez faire des choses comme:

map $request_method $cookie_auth $destination {
    default 8080;
    "^POST " 9080;
    "^PUT someAuthCookieValue" 9080;
}

De plus, cela évite l'utilisation du tout. C'est assez génial. Je l'ai utilisé pour diriger tout le trafic d'écriture dans un WordPress Cluster à un FastCGI TCP Socket sur un nœud distant mais envoyez le trafic lu à une prise LOCALITE FastCGI UNIX.

1
Andrea Rutledge

Si quelqu'un cherche un moyen de simplement effectuer des conditions par méthode de demande, la syntaxe est la suivante:

if ($request_method = DELETE ) {
   . . . 
}
1
Sych