Nginx não atualiza max-age

1

Se eu fizer uma solicitação para um servidor proxy Nginx configurado para armazenar em cache um envio de dados, receberei os seguintes cabeçalhos de resposta:

{'content-length': '13200000', 'x-cache-status': 'MISS', 'server': 'nginx/1.9.9', 'connection': 'keep-alive', 'cache-control': 'max-age=45', 'date': 'Fri, 27 Jan 2017 10:57:55 GMT'}

alguns segundos depois, faço o mesmo pedido novamente e obtenho os seguintes cabeçalhos:

{'content-length': '13200000', 'x-cache-status': 'HIT', 'server': 'nginx/1.9.9', 'connection': 'keep-alive', 'cache-control': 'max-age=45', 'date': 'Fri, 27 Jan 2017 10:58:18 GMT'}

O servidor upstream especifica o cabeçalho max-age para 45 segundos; o segundo cabeçalho de resposta não deve ter um cabeçalho max-age atualizado? Isso é max-age = 45- (tempo entre os pedidos)?

Editar

Um exemplo de configuração que reproduz o comportamento:

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream backend {
        server localhost:8080;
    }

    proxy_cache_path /etc/nginx/wwwroot/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;
            add_header X-Cache-Status $upstream_cache_status;
        }
    }

    server {
        listen 8080;
        root /etc/nginx/wwwroot;
        expires 60s;
    }
}

Resultado:

root@ubuntu:/home/parallels# curl -I localhost/testfile.txt
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 28 Jan 2017 19:08:45 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Last-Modified: Fri, 27 Jan 2017 14:45:39 GMT
ETag: "588b5d13-c"
Expires: Sat, 28 Jan 2017 19:09:45 GMT
Cache-Control: max-age=60
X-Cache-Status: MISS
Accept-Ranges: bytes

root@ubuntu:/home/parallels# curl -I localhost/testfile.txt
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 28 Jan 2017 19:08:48 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Last-Modified: Fri, 27 Jan 2017 14:45:39 GMT
ETag: "588b5d13-c"
Expires: Sat, 28 Jan 2017 19:09:45 GMT
Cache-Control: max-age=60
X-Cache-Status: HIT
Accept-Ranges: bytes
    
por olif 27.01.2017 / 12:07

1 resposta

0

Na sua configuração, o Nginx é simplesmente um proxy reverso. Não está reescrevendo nada como você não disse para reescrever nada. É simplesmente armazenar páginas geradas pelo servidor upstream e entregá-las quando for solicitado.

O servidor upstream definiu o tempo de expiração, também há um controle de cache com uma duração máxima em segundos. Eu suspeito que o Nginx não leia essas diretivas e mantenha as coisas em seu cache contanto que você tenha dito, mas alguém pode me corrigir aqui.

Não acredito que exista uma maneira de o Nginx rastrear quando o servidor upstream enviou uma página e reescreveu os cabeçalhos da página antes de entregá-lo ao cliente. Isso teria que ser feito no servidor de aplicativos.

Expires é http / 1.0, o controle de cache é http / 1.1, de acordo com este artigo . Você pode usar qualquer um deles, mas eles entram em conflito, então acho que os navegadores atualizarão a página quando ela for informada.

IMHO, você precisa descobrir o que deseja e, em seguida, configurar seu servidor de aplicativos ou o Nginx para usá-lo. O Nginx pode reescrever cabeçalhos se você tiver o módulo headers_mod da sua distribuição ou compilado em . Se há um tempo que a página não deve ser armazenada em cache depois que eu sugiro que você use expira. Se você quer apenas que os navegadores tenham páginas razoavelmente novas, então o controle de cache é melhor, pois você pode definir coisas como o armazenamento em cache por servidores proxy e CDNs. Você sempre pode ter Expires especificar o tempo e o controle de cache especificar o comportamento do cache de CDN e proxy, incluindo a revalidação.

Sugira mais reflexão e pesquisa e você resolverá o resto sozinho. Referência útil sobre o controle de cache aqui .

    
por 28.01.2017 / 21:59