Como combinar try_files e sendfile no Nginx?

1

Eu preciso que o Nginx forneça um arquivo relativo a partir do documento raiz, se existir, e depois faça um fallback para um servidor upstream, se não existir. Isso pode ser feito com algo como:

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;
    }
}

Feira suficiente. O problema é que o meu upstream não está servindo o conteúdo do URI diretamente, mas sim, retornando X-Accel-Redirect com um local relativo ao documento root (ele gera este arquivo on-the-fly):

% 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

Aparentemente, isso deve funcionar. O problema, no entanto, é que o Nginx tenta servir esse arquivo de alguma raiz de documento padrão interno em vez de usar aquele especificado no bloco 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"

Como faço para forçar o Nginx a exibir o arquivo relativo à raiz do documento correto? De acordo com documentação do XSendfile , o caminho retornado deve ser relativo, então meu upstream está fazendo a coisa certa.

    
por hcalves 26.11.2012 / 22:05

2 respostas

1

Você precisa ter sua diretiva root em server , e não em location . Este é um dos mais erros comuns de configuração do nginx .

    
por 26.11.2012 / 22:37
2

Seu back-end produz o cabeçalho X-Accel-Redirect incorreto: a parte do caminho do URI deve começar com / (consulte o RFC 3986).

    
por 28.11.2012 / 04:55

Tags