我正在testing一个设置,我想让nginx提供静态媒体,并将所有其他请求代理到另一个后端。 我的configuration如下所示:
location /media {alias /var/httpd/media;} location / {proxy_pass http://127.0.0.1:8080;}
但是,如果请求的是一个不存在的媒体资源,例如/media/foo.js尝试查找/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块中失败后继续进入/media block。
我想你有error_page 404设置在第二个位置的某个地方