2016-06-23 2 views
4

Je suis en train de mettre en place un exemple Nginx + SSI travail de base:Nginx/SSI cache fragment indépendant

config Nginx (seulement les parties pertinentes, par souci de concision):

ssi on; 
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:20m max_size=20m inactive=60m use_temp_path=off; 

server { 
    listen 80; 
    server_name localhost; 
    location/{ 
    proxy_cache my_cache; 
    proxy_set_header Host $host; 
    proxy_http_version 1.1; 
    proxy_buffering on; 
    proxy_pass http://127.0.0.1:81; 
    } 
} 

server { 
    listen 81; 
    root /path/to/root; 
    location ~ ^/.+\.php { 
    fastcgi_pass 127.0.0.1:9000; 
    } 
} 

ssi.php :

<?php 
header('Cache-Control: public, s-maxage=5'); 
?> 
Time: <?php echo time(); ?> 
Fragment time: <!--# include virtual="/time.php" --> 

time.php:

<?php 
header('Cache-Control: no-cache'); 
echo time(); 

Ils incluent fonctionne bien:

Heure: 1466710388 temps Fragment: 1466710388

Maintenant, une seconde plus tard, j'attendre la page (ssi.php) être encore mises en cache, mais le fragment time.php être frais:

heure: 1466710388 Fragment temps: 1466710389

Cependant, il reste tout à fait la même pendant 5 secondes, après quoi la page ssi est mis à jour avec le fragment:

Heure: 1466710393 temps Fragment: 1466710393

Je l'ai fait avant avec ESI et Varnish, et s'attendre à ce que cela fonctionne de la même manière avec SSI. Ai-je tort de supposer cela? Je ne trouve pas de réponse en ligne pour cela, et j'ai expérimenté différents en-têtes de contrôle de cache, mais je suis à peu près sûr que c'est la bonne façon de procéder. Qu'est-ce que j'oublie ici?

Répondre

2

Il y a un problème dans votre config: vous avez SSI activé dans les deux serveurs, en raison de

ssi on; 

défini au niveau http {}. Cela entraîne l'extension des directives SSI dans le second serveur {}. La réponse mise en cache dans le premier serveur ne contient aucune directive SSI (elle est déjà développée), et reste donc toujours la même.

Si vous voulez fragment inclus à nouveau sur chaque demande, vous devez activer SSI uniquement dans le premier serveur, par exemple .:

proxy_cache_path /path/to/cache keys_zone=my_cache:20m; 

server { 
    listen 80; 
    server_name first.example.com; 

    location/{ 
     proxy_pass http://127.0.0.1:81; 
     proxy_cache my_cache; 
     ssi on; 
    } 
} 

server { 
    listen 81; 
    server_name second.example.com; 

    location ~ ^/.+\.php { 
     fastcgi_pass 127.0.0.1:9000; 
    } 
} 

Notez que ssi on est dans le premier serveur, ainsi que proxy_cache my_cache. De cette façon, nginx mettra en cache les réponses backend avec les directives SSI, et refera le traitement SSI à chaque requête, la mise en cache inclut séparément si nécessaire.

+0

Monsieur, vous êtes géniaux! J'avais renoncé à cela, mais déplacer la directive 'ssi on' a fait l'affaire.Merci beaucoup. –

-1

vous juste one string pour la mémoire cache équivalente ou pas de cache, vous devez créer une page de test, et charger le processus php pour obtenir générer la page environ 2 secondes. et l'image de sortie et d'autres page ob statique de contenu ....

p.s. vous obtenez résultat pas de pertinence parce que vous demandez le script de serveur et de définir l'en-tête.