Comprendre la directive nginx proxy_cache_path

30

Supposons que j'ai ce fichier de configuration nginx

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • Qu'est-ce que cela keys_zone=myCache:8msignifie? Il n'y a pas grand-chose à dire dans les documents:

De plus, toutes les clés actives et les informations sur les données sont stockées dans une zone de mémoire partagée, dont le nom et la taille sont configurés par le paramètre keys_zone.

  • Que faire si proxy_cache_valid( 12h) est supérieur à la inactivevaleur spécifiée ( 1h) dans proxy_cache_path? Quelle règle suivra-t-elle? par exemple

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

Merci!

Jürgen Paul
la source

Réponses:

39

Que signifie le keys_zone = myCache: 8m?

Comme indiqué dans la documentation , nginx conservera toutes les clés actives et les informations sur les données sont stockées dans une zone de mémoire partagée, dont nameet sizesont configurées par le paramètre keys_zone. Par souci d'exhaustivité, permet de décomposer par partie

  • /var/cache/nginxest l'endroit où le cache réel est stocké. À l'intérieur du dossier, le fichier cache était un fichier binaire, mais vous pouvez facilement repérer la balise html à l'intérieur.
  • levels=1:2 Ce paramètre de niveaux définit le nombre de niveaux de sous-répertoires dans le cache.
  • keys_zone=myCache:8mdéfinissait la zone de mémoire partagée nommée myCache avec une taille maximale de 8 Mo. Il contient toutes les clés actives et les métadonnées du cache. Ainsi, chaque fois que nginx vérifie si une page a été mise en cache, il consulte d'abord la zone de mémoire partagée, puis recherche l'emplacement du cache réel /var/cache/nginxsi le cache existe.
  • max_sizeétait la taille maximale du cache, par exemple la taille des fichiers /var/cache/nginx.
  • inactive=1hspécifiez la durée maximale d'inactivité du cache peut être stocké. Les données mises en cache qui ne sont pas accessibles pendant le temps spécifié par le inactiveparamètre sont supprimées du cache, quelle que soit leur actualité.

Fonctionnement de la validation et de la suppression du cache

Extrait des listes de diffusion nginx

  • La directive proxy_cache_valid spécifie combien de temps la réponse sera considérée comme valide (et sera retournée sans aucune demande de backend). Passé ce délai, la réponse sera considérée comme "périmée" et ne sera pas retournée ou dépendra du paramètre proxy_cache_use_stale .

  • L'argument inactif de proxy_cache_path spécifie combien de temps la réponse sera stockée dans le cache après la dernière utilisation. Notez que même les réponses périmées seront considérées comme récemment utilisées en cas de demande.

Si je comprends bien, voici le pseudocode comment fonctionne nginx

Lorsque la demande arrive

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

Dans un autre processus, le gestionnaire de cache exécute cette logique

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

Que faire si proxy_cache_valid (12h) est supérieur à la valeur inactive spécifiée (1h) dans proxy_cache_path?

Tant que la demande et a accédé au cache particulier, cet objet de cache sera toujours valide jusqu'à 12h après que l'objet a été mis en cache. Après cela, le cache a été considéré comme non valide, donc nginx va récupérer du backend et réinitialiser le temporisateur valide. Mais si l'objet était inactif (non accédé) plus d'une heure - même en 12h de période de cache valide -, nginx le supprimera à cause du inactiveparamètre.

masegaloeh
la source
"Après cela, le cache a été considéré comme invalide, donc nginx va récupérer du backend et réinitialiser le temporisateur valide." - c'est intéressant. Donc, nginx récupère la requête même si aucun utilisateur ne la récupère? Ainsi, par exemple, si inactif est 365det valide est 1dalors nginx va chercher les demandes dans le cache chaque jour pendant un an même si personne ne fait cette demande?
Martin Thoma
1
Belle réponse, mais je n'arrive pas à trouver de documentation sur les unités de mesure que nous utilisons avec certains de ces paramètres. Par exemple, les inactiveparamètres prennent des valeurs de temps mais je ne vois pas quelles valeurs je peux utiliser à part h(qu'en est-il d'environ 1 mois? Ou 1 jour? Etc.) Et avec quoi devrions-nous préciser max_size? Octets? Puis-je utiliser 1M pour 1 mégaoctet?
Sunil D.
4
@SunilD. - c'est parti
adamczi