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 deslave.com\index.php
. - Parcourir pour
https://master.com/test/test.txt
et voir le texte dans le fichierslave.com\test.txt
- Parcourir pour
https://master/com/test/test.jpg
et voir l'image dans le fichierslave.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 dehttps://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 surmaster.com
soithttps://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 ^~
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
@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 –