Nginx est un serveur HTTP pouvant être utilisé en reverse proxy « proxy inverse ». Créé en 2002, c’est un serveur mature et efficace pour un environnement LAMP associé au module PHP-FPM. Cet article va vous montrer comment configurer son cache, permettant de soulager votre serveur PHP et évitant la mise en place d’un serveur type Varnish.

Nous partons du principe que NGINX est fonctionnel, avec un site qui est connecté. Dans mon cas, Nginx ne sert que de proxy, permettant de router sur les VM les sites internet.

Configuration de base :

server {                                                                                             
listen 80;                                                                                   
server_name tellaw.org *.tellaw.org;                                                                                                                                                      
location / {                                                                                         
proxy_pass              http://xxx.xxx.xxx.xxx;                                                 
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_connect_timeout   150;                                                                 
proxy_send_timeout      100;                                                                 
proxy_read_timeout      100;                                                                 
proxy_buffers           4 32k;                                                               
client_max_body_size    8m;                                                                  
client_body_buffer_size 128k;                                                        
}                                                                                    
}

D’abord, vous devez créer un repertoire permettant de stocker le contenu du cache de NGINX. Dans le cadre de cet article, j’ai créé un dossier /cache à la racine, dont le propriétaire est l’utilisateur faisant tourner NGinx et possédant les droits en écriture.

Pour optimiser les temps de lecture et écriture dans ce dossier, je l’ai monté en TMPFS. C’est un montage en mémoire, type ramdisk permettant, dans mon cas (mon serveur à des disques très peu efficaces) d’optimiser les performances.

 mount -t tmpfs -o size=2G tmpfs /cache

D’abord, nous allons décrire la zone de cache pour Nginx avec sa configuration :

Avant les paramètre de server :

proxy_cache_path /cache levels=1:2 keys_zone=mycache:10m max_size=2g inactive=1440m;

Ok, qu’elle est l’idée ???

  • /cache : Chemin vers le stockage du cache
  • levels=1:2 : Indique à Nginx d’orgniser le cache sur 2 niveaux de dossiers pour optimiser les temps de lecture/écriture. Ce paramètre doit être efficace sur un grand nombre de configuration.
  • keys_zone=mycache : Nom du cache pour faire le lien avec le ‘serveur’
  • max_size=2g : Taille Max, attention si vous utilisez TMPFS à ne pas mettre une taille trop grande pour éviter le swap.
  • inactive=1440m : Expiration du cache max. Ce paramètre est à coupler avec le max-age de vos ressources. 1440 doit correspondre à 24h, ce qui est énorme. Je vous laisse adapter pour votre site, sachant que le max-age de votre ressource doit prendre le pas.

TmpFS c’est quoi ?

Tmpfs est implémenté directement dans le noyau Linux depuis la version 2.6 (c’est à dire qu’il est disponible dans toutes les versions d’ubuntu supportés officiellement).

Il remplace les commandes de création de ramdisk, et offre l’avantage de redonner la mémoire vive aux systèmes d’exploitations en cas de non utilisation de celle-ci.

Un RAMDisk ou un volume Tmpfs dans ce cas présent est un espace dans la mémoire vive qui est utilisé pour stocker des fichiers temporairement (en effet le volume est vidé à chaque arrêt du système).

Un tmpfs est donc idéal pour stocker les fichiers temporaires de votre ordinateur. Ces fichiers temporaires sont des fichiers qui sont, par exemple, créé puis effacés lors de l’extraction d’un fichier compressé, lors d’une mise à jour, etc …

Extrait de la documentation Ubuntu

Ensuite dans la balise ‘server’, j’ajoute :

proxy_cache             mycache;

Ce qui permet de faire le lien entre ma déclaration de cache et ce serveur.

add_header              X-Cache-status $upstream_cache_status;

Permet d’ajouter un header au réponses, pour vous indiquer si ce contenu vient de votre nouveau cache 🙂

proxy_cache_revalidate  on;

Cette ligne indique à Nginx d’utiliser le header « If‑Modified‑Since » pour optimiser la bande passante et ne rafraichir que ce qui à été modifié.

proxy_cache_use_stale   error timeout updating http_500 http_502 http_503 http_504;

Cette configuration indique au serveur de servir sa page de cache puis de rafraichir le cache en tache de fond. Ceci évite un temps d’attente pour le client qui tombe au moment du rafraichissement du cache.

Ensuite un restart de Nginx et cela doit fonctionner :

/etc/init.d/nginx restart

La configuration complète :

roxy_cache_path /cache levels=1:2 keys_zone=mycache:10m max_size=2g inactive=1440m;

server {

        listen 80;
        server_name tellaw.org *.tellaw.org;

        location / {
                proxy_cache             mycache;
                add_header              X-Cache-status $upstream_cache_status;
                proxy_cache_revalidate  on;
                proxy_cache_use_stale   error timeout updating http_500 http_502 http_503 http_504;
                proxy_pass              http://xxx.xxx.xxx.xxx;
                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_connect_timeout   150;
                proxy_send_timeout      100;
                proxy_read_timeout      100;
                proxy_buffers           4 32k;
                client_max_body_size    8m;
                client_body_buffer_size 128k;
        }
}

 

Attention, pour que cela fonctionne, il faut que votre site gère correctement les header max-age de vos contenus. Pour cela, vous pouvez forcer votre .htaccess ou configuration de la façon suivante :

# BEGIN Expire headers
<IfModule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 7200 seconds"
 ExpiresByType image/jpg "access plus 2592000 seconds"
 ExpiresByType image/jpeg "access plus 2592000 seconds"
 ExpiresByType image/png "access plus 2592000 seconds"
 ExpiresByType image/gif "access plus 2592000 seconds"
 AddType image/x-icon .ico
 ExpiresByType image/ico "access plus 2592000 seconds"
 ExpiresByType image/icon "access plus 2592000 seconds"
 ExpiresByType image/x-icon "access plus 2592000 seconds"
 ExpiresByType text/css "access plus 2592000 seconds"
 ExpiresByType text/javascript "access plus 2592000 seconds"
 ExpiresByType text/html "access plus 7200 seconds"
 ExpiresByType application/xhtml+xml "access plus 7200 seconds"
 ExpiresByType application/javascript A2592000
 ExpiresByType application/x-javascript "access plus 2592000 seconds"
 ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
</IfModule>
# END Expire headers

Bien-sur, les temps sont à paramétrer suivant vos choix. Cette configuration via HTAccess n’est valable que pour un site tournant avec Apache.

N’hésitez pas à poser vos questions dans les commentaires & bon courage avec Nginx en proxy cache.

 

Vous pouvez lire la documentation complète sur la page suivante :

  • Nginx : https://www.nginx.com/blog/nginx-caching-guide/
  • Wikipedia : https://fr.wikipedia.org/wiki/Nginx