4 votes

Comment puis-je mettre en place un reverse proxy nginx combiné avec try_files ?

J'aimerais appeler un emplacement nommé qui gère une directive de proxy inverse. J'ai donc essayé les lignes suivantes dans ma section d'hôte virtuel :

upstream node_upstream {
    server 127.0.0.1:8000;
    keepalive 64;
}

server {
  server_name my.host-name.com;
  listen 80;  
  access_log  /home/webhost/logs/my-host-name.access.log;
  error_log  /home/webhost/logs/my-host-name.error.log;

  root /home/webhost/www/my.host-name.com/node-canary/public;

  location / {
    index index.html; 
    try_files $uri $uri.html $uri/index.html $uri/ @node;
  }

  location @node {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://node_upstream/;
    proxy_redirect off;
    proxy_read_timeout 240s;
  }
}

C'est assez simple, mais en l'exécutant, j'obtiens

nginx: [emerg] "proxy_pass" cannot have URI part in location
given by regular expression, or inside named location, or inside
"if" statement, or inside "limit_except" block in 
/home/webhost/sites-enabled/my.host-name.com:29
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

Pour moi, cela signifie que je ne peux pas utiliser laissez-passer dans le @node emplacement nommé.

J'ai donc pensé que je pouvais déjouer nginx en déplaçant simplement les directives situées dans l'emplacement @node vers l'emplacement racine (c'est-à-dire /). Tout ce qui se trouve à l'extérieur reste inchangé. Comme ceci :

server {
  server_name my.host-name.com;
  listen 80;  
  access_log  /home/webhost/logs/my-host-name.access.log;
  error_log  /home/webhost/logs/my-host-name.error.log;

  root /home/webhost/www/my.host-name.com/node-canary/public;

  location / {
    index index.html; 
    try_files $uri $uri.html $uri/index.html $uri/ $uri;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://node_upstream/;
    proxy_redirect off;
    proxy_read_timeout 240s;
  }
}

Mais avec cette configuration, quelque chose de bizarre se produit. Lorsqu'un fichier statique existant est consulté, la demande est traitée par la connexion du proxy (une application node). pas en répondant avec le fichier statique lui-même .

C'est le seul cas où une requête renvoie une réponse valide. Toute route ne correspondant pas à un fichier statique renvoie une erreur de serveur 500 de nginx.

Cela me déconcerte au point d'en être sidéré.

2voto

HugoFS Points 313

Le message d'erreur "proxy_pass" cannot have URI part in ... se réfère simplement à l'arrière / dans votre proxy_pass déclaration.

Utilisez :

proxy_pass http://node_upstream;

au lieu de :

proxy_pass http://node_upstream/;

Voir ce document pour les détails.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X