Nginx ssi avec proxy_cache suspendu après la première request

J'utilise le cache proxy de Nginx pour nos pages dynamics et nous avons récemment embedded ssi. Le chargement de la première page fonctionne bien, mais une fois que la page est caching et qu'une autre request survient, la page se bloque.

Les journaux semblent indiquer que plusieurs sous-requêtes sont effectuées (il n'y a qu'une seule directive et dans la layout) et je ne suis pas vraiment certain de savoir pourquoi cela se produit. La page est bien chargée lors de la première charge, la version caching tourne ses roues et se décompose. Voici ma configuration.

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 { listn 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 } } 

Et c'est la directive qui se trouve dans la layout

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

— MODIFIER —

Je viens juste de remarquer que la layout semble être à plusieurs resockets. La requête ssi ne renvoie pas de balisage autre qu'un div, je ne sais pas pourquoi l'set de la layout serait inséré plusieurs fois.

– EDIT 2 –

Je ne sais pas pourquoi cela fonctionne, mais j'ai réussi à résoudre ce problème en déplaçant les requêtes ssi en dehors de l'location / {} bloc et dans leur propre qui saute les parameters de caching et va directement au server. Ma configuration ressemble maintenant à ceci.

 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 { listn 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 } } 

Après une enquête plus approfondie, le problème semblait être que la page s'inscrivait littéralement à plusieurs resockets dans l'inclusion de ssi. Presque comme si l'inclusion comprenait la page entière, qui comprenait une inclusion, et a continué à inclure de nouveaux recursions récurrentes.

Je pense qu'en déplaçant les requêtes ssi en dehors du réglage du bloc de caching, cela a été atténué, mais je ne suis pas tout à fait sûr de pourquoi.

J'ai découvert la réponse.

Dans la config précédente, j'ai mis en cache pour $request_uri . Cela signifie que nginx va déposer et récupérer des caches en fonction de la request entrante . Le côté server inclut une autre requête, mais comme la caching est basée sur l'uri entrant, elle finit par chercher la page principale elle-même, s'insérant ainsi à plusieurs resockets.

En utilisant $uri au lieu de $request_uri nginx respectera les réécritures et les requêtes ssi, puis mettra en cache et récupérera via des namespaces appropriés (dans ce cas, les routes ssi définies par l'application).

Voici plus d'informations sur les variables de Nginx