Eu quero servir miniaturas para imagens, e essas miniaturas são geradas sob demanda, gravadas em disco, então eu quero entregá-las ao nginx para servir.
Minha pasta raiz para miniaturas é /var/www/images
. Quando recebo uma solicitação para /thumb/post1/image1.jpg
, quero processá-la assim:
- Se a imagem estiver presente em
/var/www/images/thumb/post1/image1.jpg
, veicule-a diretamente. - Se a imagem não estiver lá, ela precisa ser gerada, então passe a solicitação para a API em
@backend
. - A API gera a imagem e a grava na pasta de miniaturas, depois entrega o caminho para ela de volta ao nginx usando um
X-Accel-Redirect
cabeçalho. - O nginx reinicia o processamento na etapa 1, que será bem-sucedida porque o arquivo agora está presente.
- Se o item para o qual a miniatura foi solicitada não existir, a API retornará um 404 e o nginx deverá veicular uma imagem de espaço reservado localizada em
/var/www/images/missing.png
.
Minha configuração do nginx está assim:
upstream api {
server localhost:7440 fail_timeout=0;
}
server {
root /var/www/www.example.com/public;
location / {
try_files $uri @backend;
}
location /thumb {
root /var/www/images;
try_files $uri @backend /missing.png;
}
location @backend {
root /var/www/api.example.com/public;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_pass http://api;
#For websocket compatibility
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Minhas miniaturas são mantidas fora da pasta do projeto, então preciso de uma root
diretiva no /thumb
local para fazê-la procurar a imagem. O /
local lida com solicitações de API e outros ativos estáticos e o /thumb
local faz o mesmo, mas também tem o fallback para missing.png
.
Uma peculiaridade: por razões históricas, minha root
pasta geral não é a mesma usada pelo meu @backend
local nomeado, no entanto, estou substituindo isso em ambas as location
diretivas e não há arquivos try_files
.
No entanto, isso não funciona. As solicitações de imagens ausentes não são enviadas para a API, mas um substituto para uma imagem ausente sim! Se eu remover o fallback, as solicitações são enviadas para a API, mas o handoff para x-accel-redirect
falha, mesmo que o arquivo já exista; quando a imagem do polegar existe, o nginx não a serve – apenas atinge a API novamente.
Como isso deve ser configurado?
Sua
try_files
instrução está incorreta, o local nomeado precisa ser o último parâmetro. Além disso, a resposta 404 é gerada pelolocation @backend
bloco e não tem nada a ver com atry_files
instrução nolocation /thumb
bloco.Você deve tentar lidar
proxy_intercept_errors
comerror_page
a resposta 404 do back-end.Por exemplo: