nginx reverse proxy: comment mettre en œuvre?

J’essaie de faire un proxy inverse avec Nginx basé sur l’URL. Je veux que http://mydomain.example.com/client1/... soit redirigé vers http://127.0.0.1:8193/... J’ai essayé de nombreuses manières et aucune n’a fonctionné. Veuillez noter que l’application peut effectuer des redirections. Voici les fichiers de configuration de ma dernière solution:

défaut

 server { listen 80; server_name mydomain.example.com; location / { set $instance none; if ($request_uri ~ ^/(.*)/$) { set $instance $1; } set $no_cookie true; if ($http_cookie ~ "instance=([^;] +)(?:;|$)") { set $instance $1; set $no_cookie false; } if ($no_cookie = true) { add_header Set-Cookie "instance=$instance;Domain=$host;Path=/"; rewrite ^ / break; } include instances.conf; } 

instances.conf

 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 60; # Installation of language packs, etc. can take a long time proxy_read_timeout 10800; if ($instance = client1) { proxy_pass http://127.0.0.1:8193; } if ($instance = client2) { proxy_pass http://127.0.0.1:8194 } ... 

Lorsque le navigateur demande http://mydomain.example.com/client1/ , Nginx doit définir une instance nommée de cookie avec la valeur client1 puis redirect le trafic vers le proxy approprié. Pour les requêtes suivantes, il convient d’utiliser ce cookie pour effectuer la redirection. Le problème que j’ai est qu’il ne met jamais la variable d’ $instance à client1 . N’oubliez pas que l’application n’a aucune idée du préfixe /client1 .

Avez-vous une idée? Connaissez-vous une meilleure solution?

La regex utilisée pour obtenir le cookie était incorrecte. J’ai changé cela pour

 "instance=([^;][^ ]+)(?:;|$)" 

et ça marche maintenant.

Edit: Ce n’est qu’une partie de la solution finalement. Je suis désolé. Il y a toujours un problème. Voir mon commentaire ci-dessous.

Il n’est pas lié à votre problème mais “proxy_connect_timeout”

“Cette directive atsortingbue un délai d’attente pour la connexion au serveur en amont. Il est nécessaire de garder à l’esprit que ce délai ne doit pas dépasser 75 secondes.”

Voir le module de carte de Nginx

 map $uri $proxy { /client1 http://127.0.0.1:8193/client1; /client2 http://127.0.0.1:8194/client2; } server { server_name my.domain.com; proxy_pass $proxy; } 

Notez que append / clientX à la fin de l’URI proxy_pass supprime cette partie de l’URI de la requête (ce qui me semble rationnel, mais peut-être pas ce que vous voulez).