Je teste une configuration dans laquelle j'aimerais que nginx serve les médias statiques et transmette toutes les autres requêtes à un autre backend. Ma configuration ressemble à ceci :
location /media {alias /var/httpd/media;}
location / {proxy_pass http://127.0.0.1:8080;}
Toutefois, si une demande est faite pour une ressource média inexistante, par ex. /media/foo.js
, nginx essaie de chercher /var/httpd/media/foo.js
et si elle n'est pas trouvée, elle essaie également d'acheminer la demande par proxy vers 127.0.0.1:8080
. Voici les journaux d'erreurs de nginx :
2012/05/18 17:09:21 [error] 10073#0: *1 open() "/var/httpd/media/foo.js" failed (2: No such file or directory), client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", host: "www.example.com"
2012/05/18 17:09:21 [error] 10073#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", upstream: "http://127.0.0.1:8080/media/foo.js", host: "www.example.com"
De plus, je remarque que si /var/httpd/media/foo.js
fait existe mais n'est pas lisible par le processus exécutant nginx, alors nginx ne tente pas d'établir un proxy vers http://127.0.0.1:8080
et renvoie un 403 Forbidden
. Journal des erreurs :
2012/05/18 17:09:33 [error] 10073#0: *1 open() "/var/httpd/media/foo.js" failed (13: Permission denied), client: 127.0.0.1, server: www.example.com, request: "GET /media/foo.js HTTP/1.1", host: "www.example.com"
Pourquoi le premier scénario entraîne-t-il le traitement des deux blocs d'emplacement et le second le traitement du seul bloc d'emplacement du média ? Comment puis-je faire en sorte que le premier scénario ne traite que le bloc de localisation du média et ne tente pas d'établir un proxy avec le backend ?
Note : J'ai également essayé d'ajouter un ^~
préfixe au bloc d'emplacement du média :
location ^~ /media {alias /var/httpd/media;}
...mais cela n'a pas changé le comportement de nginx, qui a continué à descendre dans la zone d'ombre de l'ordinateur. /
après avoir échoué dans le /media
bloc.