O nginx pode ser feito para armazenar em cache as respostas upstream contendo um cabeçalho X-Accel-Redirect?

5

Estou usando o nginx como um proxy reverso na frente do servidor de aplicativos. O aplicativo responde com um cabeçalho X-Accel-Redirect informando ao nginx qual arquivo estático deve ser exibido. O que eu gostaria de poder fazer é fazer com que o nginx armazene algumas dessas respostas upstream para que ele possa exibir o arquivo correto sem precisar acessar o servidor de aplicativos.

Infelizmente, isso não funciona: o nginx parece recusar o cache de qualquer resposta com um cabeçalho X-Accel-Redirect. Se eu não usar o X-Accel-Redirect e fazer com que o servidor de aplicativos retorne o arquivo em si, o armazenamento em cache funcionará perfeitamente. No entanto, isso não é muito eficiente, pois o servidor do aplicativo precisa ler o arquivo do disco e enviá-lo para o nginx, que o grava no disco (em cache) e o envia ao cliente.

Aqui está uma versão simplificada da configuração do meu nginx:

proxy_cache_path /tmp/nginx-cache keys_zone=testzone:10m;

server {
    location / {
        proxy_cache testzone;
        proxy_pass http://localhost:8000/;
    }

    location /static-files/ {
        internal;
        alias /var/static-files/;
    }
}

Alguém sabe se o que estou tentando fazer é possível? Minha suspeita é que, quando o nginx detecta o cabeçalho do X-Accel-Redirect, ele imediatamente salta para o processamento do URI fornecido e ignora a lógica normal de armazenamento em cache, mas seria bom confirmar isso.

    
por D. Evans 22.12.2011 / 15:12

2 respostas

2

Eu tive uma situação semelhante em que o nginx não queria armazenar em cache minhas coisas, já que um webapp que eu estava usando estava tentando definir cookies que eu não queria definir.

link

A menos que você queira contratar alguém para hackear o código-fonte, o que você pode tentar fazer é que o nginx seja um proxy para si mesmo e depois para o aplicativo da Web.

Com o que está no meio, você ignora o cabeçalho X-Accel-Redirect e, assim, o cache deve se engajar novamente.

Com o da frente, você não faz o cache, mas os pedidos de proxy para aquele no meio que armazena em cache X-Accel-Redirect de respostas.

Não vejo razão para que algo assim não funcione! : -)

    
por 04.01.2013 / 10:38
-1

Sugiro que você reescreva seu servidor e o bloco de localização:

server {
    location / {
        proxy_cache testzone;
        proxy_pass http://localhost:8000;
    }

    location ~* \.(ico|js|jpg|png|gif|jpeg|mp3|wav|swf|mov|doc|pdf|flv|css)$ {
       expires max;
       proxy_cache testzone;
       proxy_pass http://localhost:8000;
    }
}

veja também no proxy_temp_path link . Embora já esteja habilitado por padrão (acho), gosto de ver essa pasta para ver se as solicitações de conteúdo estático estão sendo armazenadas.

    
por 03.01.2012 / 04:08