Я тестирую установку, в которой я хотел бы, чтобы nginx обслуживал статические носители и проксировал все остальные запросы на другой сервер. Моя конфигурация выглядит так:
location /media {alias /var/httpd/media;}
location / {proxy_pass http://127.0.0.1:8080;}
Однако, если запрос сделан для несуществующего медиаресурса, например /media/foo.js
, nginx пытается найти /var/httpd/media/foo.js
а затем, когда он не найден, он также пытается проксировать запрос на 127.0.0.1:8080
. Вот журналы ошибок 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"
Кроме того, я заметил, что если /var/httpd/media/foo.js
делает существует, но не может быть прочитан процессом, выполняющим nginx, тогда nginx не пытается прокси-сервер http://127.0.0.1:8080
и возвращает 403 Forbidden
. Журнал ошибок:
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"
Почему в первом сценарии обрабатываются оба блока местоположения, а во втором сценарии обрабатывается только блок местоположения носителя? Как я могу сделать так, чтобы первый сценарий обрабатывал только блок местоположения мультимедиа, а не пытался проксировать серверную часть?
Примечание: я также попытался добавить ^~
префикс к блоку размещения носителя:
location ^~ /media {alias /var/httpd/media;}
... но это не повлияло на поведение nginx, поскольку он продолжал падать в /
блокировать после сбоя в /media
блок.
Я думаю, у вас error_page 404 установлена где-то во втором месте