---
title: Cache Nginx
source: https://synapx.fr/blog/cache-nginx/
date: 2026-06-26
category: Serveur Web
site: SynapxLab
---

# Cache Nginx

```
 +------------------+
 |  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

```bash
sudo mkdir -p /var/cache/nginx
sudo chown -R www-data:www-data /var/cache/nginx
sudo nano /etc/nginx/nginx.conf
```

```nginx
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

```bash
sudo nano /etc/nginx/sites-available/default
```

```nginx
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

```nginx
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;
    }
}
```

```bash
sudo nginx -t
sudo systemctl restart nginx
```

## Vider le cache

```bash
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 :

```nginx
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` :

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