如何在 Nginx 上结合 try_files 和 sendfile?

如何在 Nginx 上结合 try_files 和 sendfile?

如果文件存在,我需要 Nginx 提供与文档根目录相关的文件,如果不存在,则返回到上游服务器。这可以通过以下方式实现:

server {
    listen       80;
    server_name  localhost;

    location / {
        root /var/www/nginx/;
        try_files $uri @my_upstream;
    }

    location @my_upstream {
        internal;
        proxy_pass  http://127.0.0.1:8000;
    }
}

公平地说。问题是,我的上游不直接提供 URI 的内容,而是返回X-Accel-Redirect相对于文档根目录的位置(它会动态生成此文件):

% curl -I http://127.0.0.1:8000/animals/kitten.jpg__100x100__crop.jpg
HTTP/1.0 200 OK
Date: Mon, 26 Nov 2012 20:58:25 GMT
Server: WSGIServer/0.1 Python/2.7.2
X-Accel-Redirect: animals/kitten.jpg__100x100__crop.jpg
Content-Type: text/html; charset=utf-8

显然,这应该可行。但问题是 Nginx 尝试从某个内部默认文档根目录提供此文件,而不是使用location块中指定的根目录:

2012/11/26 18:44:55 [error] 824#0: *54 open() "/usr/local/Cellar/nginx/1.2.4/htmlanimals/kitten.jpg__100x100__crop.jpg" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /animals/kitten.jpg__100x100__crop.jpg HTTP/1.1", upstream: "http://127.0.0.1:8000/animals/kitten.jpg__100x100__crop.jpg", host: "127.0.0.1:80"

如何强制 Nginx 相对于正确的文档根目录提供文件?根据XSendfile 文档返回的路径应该是相对的,所以我的上游正在做正确的事情。

答案1

你需要让你的root指令处于server,而不是处于location。这是最重要的之一常见的 nginx 配置错误

答案2

您的后端产生了错误的X-Accel-Redirect标头:URI 的路径部分必须以 开头/(请参阅 RFC 3986)。

相关内容