Nginx: usando X-Accel-Expires com Cache-Control

2

Estou usando o Nginx como um servidor proxy de armazenamento em cache. Tenho problemas com as respostas de armazenamento em cache usando os cabeçalhos X-Accel-Expires e Cache-Control .

Meu upstream retorna algum corpo de solicitação com cabeçalhos para o nginx:

[...]
X-Accel-Expires: 60
Cache-Control: no-cache
[...]

Minha intenção é que o nginx faça o cache da resposta por 60 segundos, mas os clientes terão apenas o cabeçalho Cache-Control: no-cache (para que eles não coloquem respostas no navegador).

Mas o nginx não está armazenando em cache essa resposta. Nginx honra o cabeçalho Cache-Control e ignora o cabeçalho X-Accel-Expires . Eu pensei que X-Accel-Expires é "mais strong" que Cache-Control mas não é.

Existe alguma maneira de mudar isso?

Eu sei que posso usar:

proxy_ignore_headers Cache-Control;

Mas não posso fazer isso porque não tenho cabeçalhos X-Accel-Expires em todas as respostas do servidor upstream.

Para resumir quando eu retornar os cabeçalhos de upstream:

X-Accel-Expires: 60
Cache-Control: no-cache

Eu quero armazenar em cache a resposta no cache nginx por 60s, mas retornar aos clientes Cache-Control: no-cache .

Mas quando eu retornar isso:

Cache-Control: max-age=90

(sem o cabeçalho X-Accel-Expires ) Eu quero armazenar em cache a resposta no cache nginx por 60s e retornar aos clientes Cache-Control: max-age = 90 header .

Isso é possível?

    
por Tereska 01.11.2014 / 23:25

1 resposta

1

Então,

  • Modifique o envio para enviar X-Accel-Expires todo o cabeçalho ou adicione-o com add_header diretiva (usando por exemplo $http_cache_control em uma instrução if).
  • Ignore Cache-Control header para armazenamento em cache toda vez.
  • Use um bloco upstream.
map $upstream_http_cache_control $cache_control_value {
    "~^max-age=(?<duration>\d+)$" "$duration";
}

server {

   listen 127.0.0.1:80;

    upstream nodes {
        server foo;
    }

    location / {

        if ($upstream_http_x_accel_expires = '') {
            add_header "X-Accel-Expires" $cache_control_value;
        }

        proxy_set_header "Host" $host;
        proxy_pass http://nodes;
    }

}

server {

   server_name mydomain.com;

   listen X.X.X.X:80;

   upstream intermediate {
       server 127.0.0.1;
   }

   location / {
       proxy_set_header "Host" $host;
       proxy_pass http://intermediate;
       proxy_ignore_headers 'Cache-Control';
       proxy_cache mycache;
   }

}

Para o último caso, consulte o primeiro ponto ou use proxy_cache_valid , mas com este último paremetro você não pode fazer o timeout dinâmico. Você precisa de um fluxo de trabalho coerente em um ponto.

    
por 02.11.2014 / 00:11

Tags