Forum Linux.debian/ubuntu Reverse proxy avec Nginx

Posté par  .
Étiquettes :
0
29
mar.
2011

Bonjour,

J'utilise la configuration suivante dans Nginx :

server {
  listen      80;
  server_name www;
  root        /srv/www;

  location /loc/ {
    proxy_set_header Host $host;
    proxy_set_header X-Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $server_protocol;

    proxy_pass http://localhost:8080/;
    proxy_redirect http://localhost:8080/ /loc/;
  }
}

et sa configuration équivalente dans lighttpd :

$HTTP["url"] =~ "^/" {
  proxy.server = (
    "" => (( "host" => "localhost", "port" => 8080 ))
  )
}

On notera que le serveur Web (Nginx ou lighttpd) et le serveur Web ''proxifié'' ne partagent pas le même dossier racine. Mon problème est que quand j'utilise lighttpd, tout se passe parfaitement par contre, lorsqu'il s'agit de Nginx, si un lien du type /images/mon_image.png se trouve dans la page, l'image ne sera pas affichée. En effet, Nginx voudra la récupérer à partir de son dossier racine et bien sûre l'image n'exite pas dans ce dossier mais dans celui du serveur Web "proxifié".

lighttpd gère parfaitement cette situation mais je ne saurais dire comment. Le code HTML obtenu est le même et les paquets transitant sur le réseau sont pratiquement identiques pour les deux serveurs. On voit par contre que là où Nginx génère une erreur 404,

"/srv/www/images/mon_image.png" failed (2: No such file or directory), client: 192.168.1.27, server: www, request: "GET /images/mon_image.png HTTP/1.1", host: "www", referrer: "http://www/loc/"

lighttpd traite la requête sans problème :

"GET /images/mon_image.png HTTP/1.1" 200 819 "http://www/images/mon_image.png" "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.17) Gecko/20110302 Iceweasel/3.5.17 (like Firefox/3.5.17)"

J'aimerais donc savoir comment obtenir le même résultat qu'avec lighttpd ?

  • # Pas équivalentes

    Posté par  . Évalué à 4.

    Les configurations ne sont pas équivalentes.
    Dans le cas de Nginx, tu ne reverse-proxyfies que les urls commençant par /loc/ alors que dans lighttpd, tu reverse-proxyfies toutes les urls commençant par /

    Sans rien connaître de Nginx, je verrais plutôt quelque chose dans le style :

    server {
      listen      80;
      server_name www;
    
      location / {
        proxy_set_header Host $host;
        proxy_set_header X-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $server_protocol;
    
        proxy_pass http://localhost:8080/;
        proxy_redirect http://localhost:8080/ /;
      }
    }
    

    Si vous n'aimez pas ce commentaire c'est qu'il est ironique.

    • [^] # Re: Pas équivalentes

      Posté par  . Évalué à 1.

      Maintenant que tu me le fait remarquer, tu n'as pas tord. Je me suis fait berner par la limitation de lighttpd en version 1.4 qui ne peut récrire les requêtes proxifiées du coup j'ai mis à la racine pour tester donc forcément ça fonctionne.

      La question est donc changée en comment faire fonctionner le cas de figure dans lequel Nginx se trouve ?

      Il faudrait réécrire les liens HTML comme c'est possible avec mod_proxy_html sous Apache mais cette solution ne fonctionne pas toujours surtout avec des pages complexes.

      Une autre solution serait de remplacer http://www/loc par http://loc.www/ ainsi je peux partir directement de la racine...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.