NGINX: Cache quando o X-Accel-Expires está definido

5

Eu adicionei um cabeçalho X-Accel-Expires ao meu conteúdo estático, bem como um cabeçalho Última modificação . Gostaria de saber qual é a configuração correta para armazenar em cache esses elementos sem fazer o cache de mais nada.

Isso é o que tenho no momento, mas não armazena nada em cache:

http {
include       /etc/nginx/mime.types;

access_log  /var/log/nginx/access.log;

sendfile        on;
client_max_body_size 2000m; 
keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

ssl_certificate /etc/nginx/chain.pem; 
ssl_certificate_key /etc/nginx/key.key;

proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=cache:30m max_size=1G;
proxy_temp_path /var/lib/nginx/proxy 1 2;
proxy_cache_use_stale error timeout invalid_header http_502;

server {
    listen       80;
    server_name domain;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_read_timeout 700;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
    
por mnml 26.12.2012 / 00:33

3 respostas

6

Para armazenar as coisas em cache, primeiro você precisa criar um caminho do cache do proxy dentro do http contexto, como este:

proxy_cache_path    /var/cache/nginx/site1    levels=1:2    keys_zone=site1:10m max_size=1G;

Em seguida, você também pode definir opcionalmente a chave do cache do proxy . Qualquer solicitação que tenha a mesma chave de cache que uma entrada armazenada em cache receberá a resposta armazenada em cache, se houver uma. Mas o padrão já pode ser bom o suficiente, então, isso é totalmente opcional.

Em seguida, para ativar o cache em um determinado contexto, basta mencionar qual cache deve ser usado, assim:

proxy_cache    site1;

De acordo com a descrição da diretiva cache de proxy válido , o nginx já respeita X-Accel-Expires e age sobre isso, então, você está basicamente pronto neste momento. Como você não deseja armazenar em cache nada que não inclua X-Accel-Expires , provavelmente desejará adicionar um valor 0 como o tempo válido padrão (a configuração X-Accel-Expires em seu conteúdo deve substituir esse valor padrão).

proxy_cache_valid    0m;

Eu presumo que, além da falta de qualquer cache, seu arquivo de configuração é válido e seu próprio proxy já funciona.

Então, basicamente, tudo que você precisa fazer para corrigir sua configuração é adicionar o seguinte ao seu contexto http , server ou location :

proxy_cache    cache;
proxy_cache_valid    0m;

(Além disso, você pode querer garantir que o caminho do cache exista e tenha permissões corretas, é claro).

Com relação ao artigo / exemplo mencionado habrahabr , não acho que esteja correto incluir $http_if_modified_since no chave de cache, porque você pode potencialmente acabar com muitas entradas em cache, efetivamente desperdiçando seu cache.

Observe também que o nginx provavelmente não usa o cabeçalho X-Accel-Expires do proxy - ele só o usa internamente e o IIRC não pode exibir esse cabeçalho adiante. Para alterar esse comportamento, você deve pedir explicitamente que ele também esteja em proxy (no caso de você querer depurar seu conteúdo por meio do nginx e ver como seu aplicativo define o cabeçalho, etc.):

proxy_pass_header "X-Accel-Expires";
    
por 04.01.2013 / 06:23
1

Existe um bom howto sobre o uso do X-Accel-Expires header no nginx no blog russo de TI. Eu acho que pode ser muito útil no seu caso.

    
por 28.12.2012 / 06:33
0

Acho que o motivo é que o cache está definido, mas não ativado - proxy_cache cache; está ausente.

    
por 30.12.2012 / 15:55