Como atualizar o cache de proxy reverso Nginx pelo campo ETag / Last-Modified do backend?

3

Estou tentando fazer com que meu proxy reverso Nginx funcione corretamente. No entanto, descobri que, uma vez que um arquivo é armazenado em cache, ele nunca será atualizado / revalidado, mesmo que o arquivo de back-end seja alterado, o que pode ser identificado pelo campo ETag ou LAST-Modified . Alguém por favor pode me ajudar com relação a este assunto?

Aqui está minha configuração:

proxy: proxy.test.com
backend: back.example.com

configurações nginx:

proxy_cache_path /home/cache levels=1:2 keys_zone=cache_rev:16m inactive=14d max_size=12g;
proxy_cache_key "$scheme://$host$request_uri";
server {
    listen 80 default_server;

    resolver 74.82.42.42;
    server_name proxy.test.com;

    location ~ ^/ {
        proxy_pass http://back.example.com$request_uri;
        proxy_redirect off;
        proxy_buffering on;
        proxy_cache_revalidate on;
        proxy_pass_header Set-Cookie;

        proxy_cache cache_rev;
        proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
        proxy_cache_valid 200  1d;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        add_header X-Cache-Status $upstream_cache_status;
    }
}

Aqui está o arquivo de informações curl before e after alterado.

Antes da mudança de index.html :

$ curl -I http://proxy.test.com/index.html
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sat, 12 Dec 2015 14:30:18 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 18283
Connection: keep-alive
Last-Modified: Sat, 12 Dec 2015 14:09:14 GMT
ETag: "261e044-476b-526b3fc1b6983"
Content-Language: zh-TW
X-Cache-Status: HIT
Accept-Ranges: bytes

$ curl -I http://back.example.com/index.html
HTTP/1.1 200 OK
Date: Sat, 12 Dec 2015 14:30:32 GMT
Server: Apache
Last-Modified: Sat, 12 Dec 2015 14:30:32 GMT
ETag: W/"261e044-476d-526b44eb57c31"
Accept-Ranges: bytes
Content-Length: 18285
Content-Type: text/html; charset=utf-8

Após a alteração de index.html :

$ curl -I ttp://proxy.test.com/index.html
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sat, 12 Dec 2015 14:30:54 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 18283
Connection: keep-alive
Last-Modified: Sat, 12 Dec 2015 14:09:14 GMT
ETag: "261e044-476b-526b3fc1b6983"
Content-Language: zh-TW
X-Cache-Status: HIT
Accept-Ranges: bytes

$ curl -I http://back.example.com/index.html
HTTP/1.1 200 OK
Date: Sat, 12 Dec 2015 14:30:53 GMT
Server: Apache
Last-Modified: Sat, 12 Dec 2015 14:30:53 GMT
ETag: W/"261e044-476b-526b450fe6a03"
Accept-Ranges: bytes
Content-Length: 18283
Content-Type: text/html; charset=utf-8
    
por ukyang 12.12.2015 / 15:42

1 resposta

1

Etags sozinho não irá ajudá-lo. Etag é usado para solicitações condicionais pelo cliente (navegador), para controlar seu próprio cache.

O Nginx não atingirá o upstream se encontrar o recurso em seu cache. O ponto de um proxy reverso é acelerar as coisas não conectando ao upstreadm todas as vezes. Você deve definir os cabeçalhos Expires: DATE/TIME ou Cache-control: max-age=XXX (ou melhor ambos para ter certeza) no servidor upstream para informar ao cache por quanto tempo ele pode manter os arquivos armazenados em cache. Para conteúdo dinâmico, é melhor usar cache-control: no-cache .

Verifique estes links para obter explicações mais detalhadas sobre o funcionamento do HTTP/1.1 caching:

Se você quiser remover explicitamente algo do cache, terá que implementar um mecanismo de eliminação para excluir os arquivos que deseja atualizar.

    
por 12.12.2015 / 17:01