Nginx ssi com proxy_cache interrompido após o primeiro pedido

1

Estou usando o cache de proxy do Nginx para nossas páginas dinâmicas e integrei recentemente o ssi. O carregamento da primeira página funciona bem, mas depois que a página é armazenada em cache e outra solicitação chega, a página simplesmente trava.

Os registros parecem indicar várias sub-requisições sendo feitas (existe apenas uma diretiva, e no layout) e eu não tenho certeza do porque isso está acontecendo. A página carrega bem no primeiro carregamento, a versão em cache gira suas rodas e quebra. Aqui está minha configuração.

proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=500m inactive=60m; #caching
proxy_temp_path /var/tmp; #caching

gzip_comp_level 6;
gzip_vary on;
gzip_min_length  1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;

upstream staging {
  server 127.0.0.1:1337;
}

server {
  listen 0.0.0.0:80;
  server_name dev.example.com;
  access_log /var/log/nginx/dev.example.log;
  error_log  /var/log/nginx/dev.example.error.log debug;   log_subrequest on;

  location ~ ^/(images/|scripts/|styles/|robots.txt|humans.txt|favicon.ico) { #caching
    root /home/example/app/website/public;
    access_log off;
    expires modified +1h;
  }

  location / {
    ssi on;

    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_cache one; #caching
    proxy_cache_key sfs$request_uri$scheme; #caching

    proxy_http_version 1.1;
    proxy_pass http://staging/; #points to the upstream staging
  }
}

E esta é a diretiva que está no layout

<!--# include virtual="/ssi/dynamic-content" -->

- EDITAR

Acabei de notar que o layout da página parece estar renderizando várias vezes também. A solicitação ssi não retorna nenhuma marcação diferente de div, não sei por que todo o layout seria inserido várias vezes.

- EDIT 2 -

Não sei por que isso funciona, mas consegui corrigir esse problema movendo as solicitações ssi para fora do local / {} bloco e para dentro dele, o que ignora as configurações de cache e vai diretamente para o servidor . Minha configuração agora se parece com isso.

proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=500m inactive=60m; #caching
proxy_temp_path /var/tmp; #caching

gzip_comp_level 6;
gzip_vary on;
gzip_min_length  1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;

upstream staging {
  server 127.0.0.1:1337;
}

server {
  listen 0.0.0.0:80;
  server_name dev.example.com;
  access_log /var/log/nginx/dev.example.log;
  error_log  /var/log/nginx/dev.example.error.log debug;   log_subrequest on;

  location ~ ^/(images/|scripts/|styles/|robots.txt|humans.txt|favicon.ico) { #caching
    root /home/example/app/website/public;
    access_log off;
    expires modified +1h;
  }

  #New proxy block specifically for ssi routes
  location /ssi {
    proxy_pass http://staging;
  }

  location / {
    ssi on;

    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_cache one; #caching
    proxy_cache_key sfs$request_uri$scheme; #caching

    proxy_http_version 1.1;
    proxy_pass http://staging/; #points to the upstream staging
  }
}

Depois de mais investigação, o problema parecia ser que a página estava literalmente se inserindo repetidamente no include ssi. Quase como se o include incluísse a página inteira, que também tinha um include, e continuasse a incluir novas marcações recursivamente.

Acho que, ao mover as solicitações de ssi para fora da configuração de bloqueio de armazenamento em cache, isso foi atenuado, mas não sei exatamente por quê.

    
por George 03.03.2013 / 19:33

1 resposta

0

Eu descobri a resposta.

Na configuração anterior, eu tinha o cache definido para $request_uri . Isso significa que o nginx irá arquivar e buscar caches com base na solicitação incoming . O lado do servidor inclui faz outra solicitação, mas como o cache é baseado no uri de entrada, ele busca a própria página principal, inserindo-se assim repetidamente.

Ao usar $uri em vez de $request_uri nginx respeitará as requisições de reescrita e ssi, assim armazenando em cache e buscando via namespaces apropriados (neste caso, as rotas ssi definidas do aplicativo).

Aqui estão mais informações sobre as variáveis do nginx

    
por 23.03.2013 / 15:09