10 votes

Proxy inverse de Nginx vers un autre serveur nginx servant des fichiers statiques

J'ai un serveur Nginx qui héberge une application web qui fonctionne bien en accès direct. Sa configuration est la suivante

server {
    listen 8000 default_server;

    listen [::]:8000 default_server ipv6only=on;

    root /data/www/ ;
    server_name server1.com;

    location / {
            try_files $uri $uri/ =404;
        }

    location /app/ {

    }    
}

Maintenant, je dois servir cette application à partir d'un autre serveur Nginx. J'ai donc configuré le proxy inverse comme suit

server {
        listen 80 default_server;

        listen [::]:80 default_server ipv6only=on;

        root /data/www/ ;
        server_name server2.com;

        location / {
                try_files $uri $uri/ =404;
            }

        location /app/ {
                proxy_pass http://server1.com:8000/app/;
        }    

Lorsque j'accède à l'application à partir du serveur 2, j'obtiens des erreurs comme ci-dessous, par exemple lorsque j'accède à l'application http://server2.com/app/css/app.css (désolé, je n'ai pas le droit de poster des liens)

[error] 6601#0 : *1 open() "/data/www/app/css/app.css" a échoué (2 : No such file or directory)

et aucune erreur dans les journaux du serveur 1. Pourquoi nginx recherche-t-il des fichiers statiques sur le serveur 2 alors que je l'ai configuré en tant que proxy inverse vers le serveur 1 ? La même configuration fonctionne bien avec Apache et le serveur 1.

ProxyPass /app/ http:server1:8000/app/

ProxyPassReverse /app/ http:server1:8000/app/

Qu'est-ce que j'ai manqué ?

4voto

Ernestas Points 621

Vous n'avez généralement pas besoin d'ajouter le chemin d'accès à nginx !

Le chemin depuis l'emplacement est ajouté automatiquement

donc ceci

location /app/ {
      proxy_pass http://server1.com:8000/app/;
}

devrait vraiment être :

 location /app/ {
      proxy_pass http://server1.com:8000;
}

3voto

John Keates Points 671

Le problème vient de votre deuxième instance de nginx qui essaie de servir les fichiers localement :

   location / {
           try_files $uri $uri/ =404;
      }

Enlevez juste le tout si vous voulez servir en utilisant http://server2.com/app/ . Si vous voulez utiliser http://server2.com/ à la place, mettez à jour la configuration pour refléter cela :

  listen [::]:80 default_server ipv6only=on;

   server_name server2.com;

   location / {
          proxy_pass http://server1.com:8000/app/;
  }

0voto

mlabbe Points 2694

Essayez de mettre le plus spécifique /app/ dans votre proxy avant/au-dessus de l'emplacement plus générique / car nginx peut traiter les règles d'emplacement d'une manière que vous n'aviez pas prévue.

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