Use o mtime do arquivo em cache como o valor do cabeçalho Last-Modified

5

No nginx 1.10.1 Estou fazendo proxy de um site externo (não sob meu controle) para armazenar em cache as imagens localmente.

minha configuração é a seguinte:

location ~ /cachedimages/(?<productcode>.*)/(?<size>.*)/image.jpg {
   resolver 127.0.0.1;
   proxy_pass             https://www.externalsite.example/api/getImage/?productcode=$productcode&size=$size;
   proxy_cache            imgcache;
   proxy_cache_valid      200  1d;
   proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;

   expires 1M;
   access_log off;
   add_header 'Cache-Control' "public";
   add_header Last-Modified $upstream_http_last_modified;
   add_header X-Proxy-Cache $upstream_cache_status;
  }

imgcache é definido seguindo:

proxy_cache_path /var/cache/nginx/imgcache levels=1:2 keys_zone=imgcache:10m max_size=1g inactive=24h;

O servidor remoto não fornece o cabeçalho Last-Modified :

curl -X GET -I https://www.externalsite.example/api/getImage/?productcode=abc123&size=128
HTTP/1.1 200 OK
Date: Thu, 15 Sep 2016 08:16:07 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: image/jpeg

e meu servidor adiciona algum cabeçalho, mas não Last-Modified

curl -X GET -I https://www.myserver.com/cachedimages/abc123/128/image.jpg
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 15 Sep 2016 08:33:26 GMT
Content-Type: image/jpeg
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Sat, 15 Oct 2016 08:33:26 GMT
Cache-Control: max-age=2592000
Cache-Control: public
X-Proxy-Cache: HIT

Como posso forçar o nginx a ler o mtime do arquivo em cache (e a ser atingido) e exibi-lo como Last-Modified do valor do cabeçalho?

    
por EndelWar 15.09.2016 / 10:36

1 resposta

2

A variável incorporada $upstream_http_* armazena os cabeçalhos enviados pelo servidor upstream no cache. Você pode abusar do cabeçalho Date: enviado pelo upstream para preencher o cabeçalho Last-Modified enviado pelo seu proxy reverso, desta forma:

 add_header Last-Modified '$upstream_http_date';

Funciona como esperado:

  Last-Modified: Sun, 22 Apr 2018 08:48:44 GMT
  X-Cached: MISS
  ...
  Last-Modified: Sun, 22 Apr 2018 08:50:05 GMT
  X-Cached: HIT
  ...
  Last-Modified: Sun, 22 Apr 2018 08:50:05 GMT
  X-Cached: HIT

Mais informações sobre $ upstream_http_ * aqui: link (procure por $ upstream_http_name).

Dito isto, o que você está tentando alcançar é uma geralmente uma má idéia: o proxy reverso não tem idéia se o objeto upstream foi atualizado desde que foi último buscado ou não, ainda assim, ele informará ao cliente que o objeto não foi modificado. Esta é uma informação falsa.

É claro que pode haver razões pelas quais você deseja fazer isso, ou seja, se você tiver controle total sobre qualquer atualização de objeto que esteja ocorrendo no upstream e / ou planejar o esvaziamento do cache do proxy reverso sempre que necessário.

Se você tiver um único proxy reverso, recomendo enfaticamente que você analise ETags como uma solução melhor para o seu problema. Se você tiver um conjunto de proxies reversos usando ETags, será complicado.

    
por 22.04.2018 / 11:03

Tags