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 : - /
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.
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 : - /
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!
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.
Como mencionado no comentário de Andrew Ty sobre a questão aqui.
Tags nginx