+------------------+
 |  Utilisateurs    |
 +---------+--------+
           |
           v                            
+---------------------------------------+
|  Nginx (proxy inverse)  + Cache       |
+---------+-----------------------------+
          |
          v                      
+---------------------------------+
|  Apache + (PHP / FastCGI)       |
+---------+-----------------------+

Le cache de Nginx stocke temporairement des copies des réponses du backend, comme Apache, afin d'alléger la charge des serveurs applicatifs et d'améliorer les performances.

Configuration des zones de cache

sudo mkdir -p /var/cache/nginx
sudo chown -R www-data:www-data /var/cache/nginx
sudo nano /etc/nginx/nginx.conf
http {
    # Autres configurations existantes...

    # Configuration des zones de cache
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    # Paramètres du cache
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
    proxy_cache_use_stale error timeout updating invalid_header http_500 http_502 http_503 http_504;
    proxy_ignore_headers "Cache-Control" "Expires";
}

Rôle des directives :

  • proxy_cache_path : définit le chemin du répertoire de cache et ses principaux paramètres.
  • levels=1:2 : organise le répertoire de cache en sous-répertoires.
  • keys_zone=my_cache:10m : crée une zone de mémoire partagée nommée my_cache, d'une taille de 10 mégaoctets, pour stocker les clés de cache.
  • max_size=1g : fixe la taille maximale du cache à 1 gigaoctet.
  • inactive=60m : supprime les objets de cache restés inutilisés pendant 60 minutes.
  • use_temp_path=off : écrit directement dans le chemin de cache indiqué, sans passer par un répertoire temporaire.
  • proxy_cache_key : définit la clé unique utilisée pour enregistrer et retrouver les objets en cache.
  • proxy_cache_valid : précise la durée de validité des réponses en cache selon les codes de réponse HTTP.
  • proxy_cache_use_stale : autorise Nginx à servir un cache périmé dans certains cas, notamment en cas d'erreur serveur.
  • proxy_ignore_headers : ignore certains en-têtes de réponse pour calculer la durée de vie du cache.
  • proxy_cache : active le cache pour cette localisation.
  • proxy_cache_bypass et proxy_no_cache : permettent de contourner le cache selon certaines conditions, par exemple en présence d'une session ou d'une authentification.
  • add_header X-Proxy-Cache : ajoute un en-tête HTTP à la réponse afin d'indiquer l'état du cache (HIT, MISS, BYPASS).
  • location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?)$ : applique un cache agressif aux fichiers statiques.
  • location / : correspond à la configuration par défaut pour les autres requêtes, avec un cache plus prudent afin d'éviter les pages liées à une session.

Activer le cache sur le site

sudo nano /etc/nginx/sites-available/default
server {
    listen 80;
    server_name nomdedomaine.fr;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_no_cache $http_authorization $cookie_PHPSESSID;
        proxy_cache_bypass $http_authorization $cookie_PHPSESSID;
        add_header X-Proxy-Cache $upstream_cache_status;
    }
}

Pour les sites dynamiques PHP + base de données

server {
    listen 80;
    server_name nomdedomaine.fr;

    # Cache des contenus statiques
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?)$ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        expires 30d;
        proxy_cache my_cache;
        proxy_cache_valid 200 30d;
        add_header X-Proxy-Cache $upstream_cache_status;
    }

    # Pages dynamiques : cache prudent, évité si session/authentification
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_no_cache $http_authorization $cookie_PHPSESSID;
        proxy_cache_bypass $http_authorization $cookie_PHPSESSID;
        add_header X-Proxy-Cache $upstream_cache_status;
    }
}
sudo nginx -t
sudo systemctl restart nginx

Vider le cache

sudo systemctl stop nginx && sudo rm -rf /var/cache/nginx/* && sudo systemctl start nginx

Autre possibilité : si votre build Nginx inclut le module adéquat, proxy_cache_purge permet une gestion plus fine :

location /purge {
    allow 127.0.0.1;
    deny all;
    proxy_cache_purge my_cache "$scheme$request_method$host$request_uri";
}

Pour purger un élément précis du cache, utilisez la commande curl :

curl -X PURGE http://127.0.0.1/cached/path