2017-09-11 1 views
1

je la configuration suivanteNginx proxy_pass ne fonctionne que partiellement

  • serveur maître - appeler https://master.com
  • serveur esclave - appeler https://slave.com

deux run Nginx sur Ubuntu 16.04

Sur le serveur maître, j'ai créé le bloc de configuration suivant dans mon fichier /etc/nginx/sites-available/default

location /test 
{ 
rewrite ^/test(.*) /$1 break; 
proxy_pass https://slave.com; 
proxy_read_timeout 240; 
proxy_redirect off; 
proxy_buffering off; 
proxy_set_header Host $host; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header X-Forwarded-Proto https; 
} 

Un service nginx reload plus tard master.com et je peux faire ce qui suit

  • Parcourir pour https://master.com/test et afficher la sortie de slave.com\index.php.
  • Parcourir pour https://master.com/test/test.txt et voir le texte dans le fichier slave.com\test.txt
  • Parcourir pour https://master/com/test/test.jpg et voir l'image dans le fichier slave.com\test.jpg.

Cependant, je ne peux pas faire une des opérations suivantes

  • Parcourir pour https://master.com/test/test.php qui, au lieu de me montrer la sortie de https://slave.com/test.php me affiche un message d'erreur 404
  • Parcourir pour https://master.com/test/adminer/adminer.php qui, au lieu de me montrer l'écran de connexion pour l'instance Adminer sur l'esclave, https://slave.com/adminer/adminer.php me montre l'écran de connexion pour l'instance Adminer sur master.com soit https://master.com/adminer/adminer.php

C'est clairement parce qu'il me manque quelque chose dans ma configuration Nginx sur master.com. Cependant, je suis incapable de voir ce que cela pourrait être.

Dans l'intérêt de l'exhaustivité, voici ma configuration sur les deux serveurs:

Ubuntu - 16.04.3 Nginx - 1.10.3 PHP - 7.0.22

I devrait expliquer pourquoi le ^~ est requis puisque ce n'est pas clair de ma question originale. J'ai une autre configuration de bloc pour gérer les scripts PHP sur master.com.

location ~ \.php$ 
{ 
try_files $uri =404; 
fastcgi_split_path_info ^(.+\.php)(/.+)$; 
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
fastcgi_index index.php; 
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
include fastcgi_params; 
} 

En raison de la façon dont Nginx traite ces directives ce bloc est prioritaire en matière de manipulation .php fichiers et master.com finit localement pour la recherche .php scripts qui sont en fait sur slave.com. La seule façon d'éviter cela est d'utiliser ^~

Répondre

1

Votre approche est erronée. À l'intérieur du bloc qui gère /test, réécrivez-le et envoyez-le hors du bloc.Le proxy_pass n'arrive jamais réellement parce que la nouvelle URL n'a pas /test dedans. La solution est simple, ne pas utiliser récrire

location /test/ 
{ 
proxy_pass https://slave.com/; 
proxy_read_timeout 240; 
proxy_redirect off; 
proxy_buffering off; 
proxy_set_header Host $host; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header X-Forwarded-Proto https; 
} 

/ à la Adjonction fin du chemin d'accès et également le serveur proxy_pass fera en sorte ce qui est après /test/ envoyé à votre adresse proxy_pass

Modifier- 1

Voici un exemple de test que j'avais défini avant de publier cette réponse.

events { 
    worker_connections 1024; 
} 
http { 
server { 
    listen 80; 

    location /test1 { 
    proxy_pass http://127.0.0.1:81; 
    } 

    location /test2 { 
    proxy_pass http://127.0.0.1:81/; 
    } 

    location /test3/ { 
    proxy_pass http://127.0.0.1:81; 
    } 

    location /test4/ { 
    proxy_pass http://127.0.0.1:81/; 
    } 

} 

server { 
    listen 81; 

    location/{ 
    echo "$request_uri"; 
    } 
} 
} 

maintenant les résultats explique la différence entre les 4 blocs de localisation

$ curl http://192.168.33.100/test1/abc/test 
/test1/abc/test 

$ curl http://192.168.33.100/test2/abc/test 
//abc/test 

$ curl http://192.168.33.100/test3/abc/test 
/test3/abc/test 

$ curl http://192.168.33.100/test4/abc/test 
/abc/test 

Comme vous pouvez le voir dans /test4 url le seul serveur proxy voit /abc/test

+0

J'upvoted votre réponse parce que vous mentionnez à juste titre que j'ai besoin de la barre oblique '/' sur '/ test'. Cependant, ce n'est pas tout à fait la bonne réponse. Le 'rewrite' est requis puisque sur le serveur de destination la ressource demandée est dans le document racine, pas dans un sous-dossier'/test'. Je me suis souvenu que j'avais rencontré ce problème il y a un certain temps et que j'avais [https://stackoverflow.com/questions/29212655/nginx-php-scripts-not-being-called-from-reverse-proxy](solution) sur SO de @SeriousDron. Pour couper une longue histoire, 'location/test /' doit être changé pour lire 'location^~/test /' et tout fonctionne! – DroidOS

+0

@DroidOS, la réponse est correcte et vous n'avez pas besoin d'une réécriture. Vous auriez besoin de '^ ~' s'il y a un autre emplacement qui gère votre requête en raison de l'ordre de priorité. Donc, si vous vérifiez mon édition, vous verrez pourquoi et quand une réécriture n'est pas nécessaire –