web-dev-qa-db-fra.com

Temps de cache par défaut Nginx par défaut avec le contrôle du cache et aucune expiration

J'ai mis en cache activé sur un proxy Nginx.

Comme je le comprends, tant que je n'ignore pas le Cache-Control en-tête dans ma configuration proxy (proxy_ignore_headers), le temps de cache avant l'expiration peut être défini à partir du serveur d'origine à l'aide de Cache-Control = max-age=XXXX.

Mais quel serait le temps de cache par défaut qu'il conserverait et utiliserait pour quelque chose comme Cache-Control: public? Existe-t-il un moyen de définir une heure de cache maximale par défaut pour ces ressources?

3
dlrust

Vous seriez probablement mieux éteint de régler ou de réécrire les en-têtes de contrôle du cache à l'intérieur de Nginx. J'ai un tutoriel sur ceci ici , et la première partie du tutoriel a des fichiers de configuration téléchargeables. Les parties clés sont ci-dessous

Vous avez besoin Headers_Plus pour que cela fonctionne. Certaines distributions incluent ceci, certaines non et vous devez construire à partir de la source - ce qui est assez facile et est inclus dans mon tutoriel.

copié du tutoriel

Nous utilisons quelques techniques différentes pour définir des en-têtes de contrôle de cache. Tout d'abord, nous supprimons les en-têtes existants, comme le très ancien pragma qui n'est plus utile, le nettoyage expire les en-têtes (ce qui est probablement inutile car nous les définissons plus tard) et nous effacons le nom du serveur pour la sécurité.

more_clear_headers "Pragma"; more_clear_headers Server; more_clear_headers "Expires";

Ensuite, nous pouvons régler l'en-tête manuellement. Pour l'image, nous utilisons une longue période d'expiration

add_header Cache-Control "public, max-age=691200, s-maxage=691200";

Pour les pages, nous le gardons plus court - de nombreux sites auront besoin de beaucoup plus court

add_header Cache-Control "public, max-age=86400, s-maxage=86400";

Dans certains endroits, nous utilisons un format alternatif, pour une commodité.

expires 8d;

Exemple de configuration NGinx

Un exemple de serveur Nginx (avec certaines parties manquant comme SSL Configuration)

# Caching. Putting the cache into /dev/shm keeps it in RAM, limited to 10MB, for one day.
# You can move to disk if you like, or extend the caching time

fastcgi_cache_path/dev/shm/nginxcache Niveaux = 1: 2 keys_zone = cache: 50m inactif = 1440m; #RAM

# This needs to match your PHP configuration. Port is sometimes 9000 ****
upstream php {
  server 127.0.0.1:9001;
}

server {
  server_name www.example.com;
  listen 443 ssl http2;

  root /var/www/***folder;

    location ~*  \.(jpg|jpeg|png|gif|css|js|ico|svg)$ { 
  log_not_found off; access_log off;

    # Set up caching - 8 days for static resources
    # Remove the old unnecessary Pragma and hide the server version
    more_clear_headers "Cache-Control";
    add_header Cache-Control "public, max-age=691200, s-maxage=691200";
    more_clear_headers Server; more_clear_headers "Pragma"; mo  re_clear_headers "Expires";
}


  # PHP requests
  location ~ \.php$ {
    fastcgi_keep_conn on;
    fastcgi_intercept_errors on;
    fastcgi_pass   php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

    # Use the cache defined above. Cache 200 (success) status's, for 24 hours, and cache
    # specific other status's for an hour. This helps mitigate DDOS attacks.
    # Only cache GET and HEAD requests
    fastcgi_cache CACHE;
    fastcgi_cache_valid 200 1440m;
    fastcgi_cache_valid 403 404 405 410 414 301 302 307 60m;
    add_header X-Cache $upstream_cache_status;

    fastcgi_cache_methods GET HEAD; 
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    # Set the cache control headers we prepared earlier. Remove the old unnecessary Pragma and hide
    # the server version. Clearing existing headers seems necessary
    more_clear_headers "Cache-Control";
    add_header Cache-Control $cacheControl;
    more_clear_headers "Pragma"; more_clear_headers Server; more_clear_headers "Expires";
  }
}
3
Tim

C'est vrai, par défaut, avec juste proxy_cache configuré, Nginx ne cache que les réponses qui ont max-age défini dans le Cache-Control entête.

Sans aucun Cache-Control en-tête ou juste Cache-Control: public nginx ne cache pas la réponse (c'est-à-dire que vous obtenez chaque fois X-Cache-Status: MISS Lorsque vous configurez également add_header X-Cache-Status $upstream_cache_status;).

Vous pouvez configurer une heure de mise en cache par défaut pour les réponses sans Cache-Control en-tête ou ceux sans max-age champ dans un Cache-Control entête:

    # for 200, 301, 302 responses
    proxy_cache_valid     10m;
    # for all other responses
    proxy_cache_valid any 1m;

Cela signifie un Cache-Control L'en-tête a priorité sur un proxy_cache_valid réglage et il n'y a pas de valeur par défaut pour proxy_cache_valid.

1
maxschlepzig