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ê.