como obter o nginx com proxy_pass e if_modified_since para retornar um 304-não modificado

3

Eu vejo indicações de que isso deve funcionar, então espero não ter algo simples.

Temos dois "servidores" nginx, um cache proxy_pass na frente e um servidor SSI atrás dele. Se eu for diretamente para o servidor SSI com um cabeçalho If-Modified-Since na solicitação, ele retornará uma resposta 304-Not Modified, que é o que queremos. Mas não consigo fazer com que o servidor de cache proxy_pass retorne um 304-Not Modified para nada.

Devem ser capaz de obter o proxy_pass para retornar um 304-Not Modified? Alguém mais trabalha com uma configuração que você possa compartilhar? Ou você consegue identificar o problema na minha configuração?

# this is the cache in front
server {
    listen 8096;    
    server_name _;
    proxy_buffering on;

    location /assets {
        proxy_pass http://localhost:8095;
        proxy_cache   my-cache;
        proxy_cache_valid  200s;
        if_modified_since before;
    }       
}

server {
    listen 8095;
    server_name _;
    root /var/www/;
    location / { deny all; }

    location /assets {}
        ssi on; # on or off doesn't make a difference to the front-end cache behavior
        if_modified_since before;   
    }
}

# here's the base config, fwiw:
proxy_buffering         on;
proxy_cache_valid       any 10m;
proxy_cache_path        /var/cache/nginx levels=1:2 keys_zone=my-cache:8m max_size=3000m inactive=24h;
proxy_temp_path         /var/cache/nginx/tmp;
proxy_buffer_size       4k;
proxy_buffers           100 8k;

Obrigado.

    
por Kevin G. 18.04.2013 / 19:01

2 respostas

1

Sim, é possível e sim esta configuração funciona bem. Acontece que nginx estava fazendo cache de um conjunto de cabeçalhos Expira para a próxima semana do meu teste. Never Mind : - /

    
por 18.04.2013 / 20:30
0

O problema é que o nginx não passa if-modified-since do cliente para o servidor upstream quando o cache está em vigor (acredito que dependerá da presença de uma configuração proxy_cache ). O Nginx retira o if-modified-since header com base na minha investigação [1].

A solução é adicionar proxy_set_header If-Modified-Since $http_if_modified_since ao front-end [2]. Felizmente, o nginx não tenta ser muito inteligente aqui ... ele replica fielmente o cabeçalho na solicitação para o upstream, que é o que queremos.

O comportamento padrão do Nginx faz sentido se estivermos apenas armazenando arquivos estáticos em cache, mas se for uma decisão mais complexa sobre o servidor de aplicativos decidir se deve gerar novamente o conteúdo, precisamos passá-lo!

  1. Caso alguém queira investigar isso, descobri que isso está acontecendo adicionando $http_if_modified_since ao formato de log de acesso do nginx, no servidor front-end e no servidor upsteam. Para uma determinada solicitação, o servidor front-end registrou o cabeçalho if-modified-since que havia sido enviado pelo cliente, mas a mesma solicitação foi registrada com um cabeçalho if-modified-since vazio até que eu apliquei a proxy_set_header fix.

  2. Como mencionado no comentário de Andrew Ty sobre a questão aqui.

por 27.10.2018 / 12:41

Tags