Je configure la mise en cache côté serveur soit avec Nginx ou Apache et des règles de cache claires, tout en surveillant l'effet sur les temps de réponse. Ainsi, je réduis sensiblement la charge du serveur, je livre plus de requêtes par seconde et je maintiens la rapidité fiable des sites web dynamiques sous une charge élevée.
Points centraux
Avant de définir des réglages, je classe clairement les objectifs : quels contenus peuvent être Cachecombien de temps et à quel niveau. Pour les pages dynamiques, je prévois des exceptions pour Sessions et des données personnalisées. Je choisis l'architecture appropriée et vérifie si un reverse proxy est utile. Ensuite, je structure la configuration en propres vHosts et je vérifie systématiquement les en-têtes. Pour finir, j'ancre le monitoring afin de pouvoir évaluer avec certitude l'effet de chaque modification.
- Architecture clarifier
- Type de cache définissent
- En-tête impôts
- Invalidation planifier
- Suivi établir
Bases : Que signifie la mise en cache côté serveur ?
La mise en cache côté serveur stocke les réponses à des Requêtes sur le serveur web, afin que je puisse livrer des contenus fréquemment demandés sans avoir à les recalculer. Le temps jusqu'au premier octet diminue sensiblement, car l'application, la base de données et le système de fichiers ont moins de travail. Je fais la différence entre le cache au niveau du proxy, le cache FastCGI et le cache de fichiers pour les pages statiques. Actifs. Il est important d'établir un plan strict pour déterminer quels contenus sont considérés comme publics et lesquels restent personnalisés. Pour chaque règle, je détermine une durée de vie (TTL) et des conditions claires pour le vidage du cache.
Nginx et Apache - Architecture et concepts de cache
Nginx fonctionne déclenché par un événement et convient donc très bien pour un parallélisme élevé et une mise en cache rapide. Apache utilise des processus et des threads, mais offre un paysage de modules très flexible que je peux contrôler avec précision. Pour les contenus statiques, Nginx convainc par sa charge CPU très faible, tandis qu'Apache marque des points avec la profondeur de ses fonctionnalités pour les applications dynamiques. Si j'utilise un reverse proxy, presque toutes les applications bénéficient de temps de réponse plus courts. Je donne ici un aperçu des performances de Nginx en tant que reverse proxy : Nginx comme proxy inverse.
Le tableau suivant résume les principales différences et m'aide à trouver la bonne solution. Stratégie de choisir des outils. Je classe ainsi mieux les exigences, les outils et les plans d'exploitation futurs. Je tiens compte de la maintenance, de la complexité de l'application et des pics de charge typiques. Plus le contenu est simple, plus le potentiel d'agressivité est élevé. Mise en cache. Pour les contenus très dynamiques, je mise plutôt sur des exceptions spécifiques et des TTL plus courts.
| Critère | Apache | Nginx |
|---|---|---|
| Architecture logicielle | Basé sur les processus et les threads | Contrôlé par l'événement (asynchrone) |
| Contenu statique | Bon | Très rapide |
| Contenu dynamique | Très flexible (modules) | À propos de PHP-FPM/Upstreams |
| Fonctions de cache | mod_cache, mod_file_cache | Cache FastCGI, cache proxy |
| Configuration | Centralisé & via .htaccess | Centralisé dans nginx.conf |
Configurer Nginx : Cache FastCGI étape par étape
Je définis d'abord un Chemin de la cache et une zone nommée, afin que Nginx stocke le contenu de manière structurée. Ensuite, je connecte les flux ascendants PHP (par exemple PHP-FPM) et j'active fastcgi_cache dans les emplacements appropriés. Pour les applications dynamiques, je place Dérivation de la mémoire cache pour les cookies tels que PHPSESSID ou pour les utilisateurs connectés, afin que les pages personnalisées restent fraîches. Avec fastcgi_cache_valid, j'attribue des TTL pour les codes d'état et je veille à un vieillissement contrôlé des contenus. Avec l'en-tête X-FastCGI-Cache, je vois si une requête était un HIT, un MISS ou un BYPASS et je peux affiner mes règles de manière ciblée.
Configurer Apache : utiliser mod_cache en toute sécurité
Sous Apache, j'active mod_cache et mod_cache_disk ou le backend de mémoire partagée, en fonction de Objectif. Dans la configuration vHost, j'active CacheEnable de manière ciblée, je définis des valeurs Expires et j'ignore les en-têtes tels que Set-Cookie si les contenus doivent rester publics. Pour un contrôle plus précis, j'utilise des scopes de fichiers et de chemins afin que seuls les fichiers appropriés soient affichés. Ressources dans le cache. Lorsque l'application le permet, je définis correctement le contrôle du cache et crée ainsi une interaction claire entre l'application et le serveur. Pour les règles au niveau des répertoires, j'ai recours à ce document compact. Guide .htaccess.
Règles de cache et edge cases : cookies, sessions, chaînes de requête
Je bloque les messages personnalisés Réponses systématiquement à partir de la mise en cache, par exemple à l'aide de cookies de session. Pour les chaînes de requête, je fais la distinction entre les variantes réelles (p. ex. la pagination) et les paramètres de suivi que je supprime ou ignore. Pour les API ou les résultats de recherche, j'attribue des TTL courts ou je les mets complètement sur NO-CACHE pour éviter les faux positifs. Résultats d'éviter de le faire. Je ne mets pas en cache les téléchargements de fichiers et les POST de formulaires, alors que je peux mettre en cache de manière agressive les images d'aperçu et les actifs. Pour les landing pages avec rush de campagne, je prévois des TTL courts mais efficaces, plus une invalidation rapide en cas de modification.
Surveillance et débogage : comprendre les taux de réussite du cache
J'observe X-Cache ou X-FastCGI-Cache dans les En-têtes de réponse et mesure le taux de réussite en fonction du temps. Les fichiers journaux et les modules d'état m'indiquent la charge de travail, les latences et les situations d'erreur. En effectuant de brefs tests après les modifications, je vérifie si les échecs se transforment en succès et si aucune réponse sensible n'est enregistrée dans le système. Cache se posent. Les tests de charge révèlent les chemins qui s'échauffent et aident à affiner les règles spécifiques. Cela me permet d'identifier rapidement les goulets d'étranglement et de maintenir la réactivité de l'environnement en cas de pics de charge réels.
Conception de clés de cache et stratégies Vary
Une clé de cache propre détermine si les différentes variantes sont séparées proprement ou mélangées par inadvertance. Je définis la clé consciemment et je tiens compte du schéma, de l'hôte, du chemin et des paramètres pertinents. J'exclue les paramètres de suivi, j'inclus les vraies variantes (p. ex. la pagination, le tri, la langue). Au niveau de Nginx, j'y parviens par le biais de variables et de maps, dans Apache par le biais de règles ciblées et du respect de la "règle d'or". Vary-en-tête.
- Séparation de l'hôte et du protocole : inclure explicitement http/https et les domaines dans la clé, si les deux variantes existent.
- Normaliser les chaînes de requête : uniformiser l'ordre, rejeter les paramètres non pertinents, whitelister les paramètres pertinents.
- Variantes d'appareils et de langues : Ne mettre en cache que si la séparation est nette (par ex. par sous-domaine, chemin ou cookie explicite) ; sinon, il y a risque d'explosion de la clé.
- Définir correctement l'en-tête Vary : Accept-Encoding pour Gzip/Brotli, Accept-Language optionnel, jamais Vary : *
- Tenir compte des cookies avec parcimonie : N'inclure dans la décision que les cookies qui influencent réellement la présentation (par exemple le statut de connexion).
J'évite ainsi l'empoisonnement du cache et je maîtrise le nombre de variantes d'objets. Moins de variantes signifie des taux de réussite plus élevés et des coûts de stockage réduits.
Stratégies de fraîcheur, de revalidation et de stagnation
Je combine TTL avec revalidation, pour garder le contenu frais et stable à la fois. Pour les caches partagés, s-maxage et Cache-Control sont essentiels. En outre, j'utilise des stratégies de stale pour continuer à fournir des réponses rapides en cas de problèmes en amont.
- s-maxage vs max-age : s-maxage contrôle les caches partagés (proxy, CDN), max-age le navigateur. Pour le HTML, je règle souvent s-maxage sur quelques minutes, max-age sur une courte durée ou sur zéro.
- stale-while-revalidate : Les utilisateurs reçoivent les anciennes réponses pendant que les mises à jour sont effectuées en arrière-plan. Cela permet de lisser sensiblement les pics de charge.
- stale-if-error : En cas d'erreurs 5xx, je continue à me servir dans le cache pour masquer les défaillances.
- use_stale/Mise à jour de l'arrière-plan : Sous Nginx, j'utilise use_stale et les mises à jour en arrière-plan ; sous Apache, je mise sur des options comme CacheStaleOnError.
- ETag/Last-Modified : La revalidation permet d'économiser de la bande passante lorsque le client envoie If-None-Match/If-Modified-Since et que le serveur renvoie 304.
Cette combinaison me permet d'obtenir des temps de réponse courts et des services robustes, même lors de déploiements ou de courtes latences en amont.
Microcaching et absorption des pics de charge
Pour les pages très dynamiques, qui sont certes fréquemment interrogées, mais avec des résultats similaires, je place Microcaching est activée. Je mets en cache les résultats HTML pendant 1 à 10 secondes et évite ainsi que 1.000 requêtes similaires ne se répercutent simultanément dans l'application.
- Court mais efficace : Un TTL de 3 à 5 secondes réduit énormément la charge de pointe sans que les utilisateurs ne remarquent les contenus obsolètes.
- Granulaire : Activer uniquement sur les hotspots (page d'accueil, pages de catégories, suggestions de recherche), pas globalement.
- Bypass pour la personnalisation : Les sessions, les cookies de cartographie ou de connexion excluent le microcaching.
Le microcaching est un levier avantageux pour réduire les coûts et augmenter la stabilité sous burst-traffic.
Éviter la débandade du cache : Verrouillage et limites
Avec un Cuisinière Thundering de nombreuses requêtes simultanées s'exécutent sur un objet expiré. J'évite cela en bloquant les requêtes pendant qu'une copie fraîche est créée.
- Nginx : activer cache_lock pour les caches proxy et FastCGI et choisir judicieusement les délais d'attente.
- Apache : Utiliser CacheLock pour éviter que tous les travailleurs ne touchent l'application en même temps.
- Limiter les ressources : Dimensionner de manière appropriée les connexions simultanées en amont, les travailleurs et les profondeurs de file d'attente.
De plus, un s-maxage un peu plus long plus la revalidation aide à ce que les objets tombent rarement du cache de manière synchrone.
Prendre une décision : Quand Nginx, quand Apache, quand Varnish ?
Pour les contenus statiques et les applications PHP avec des règles de cache claires, j'utilise généralement Nginx avec le cache FastCGI. Pour les configurations d'apps complexes avec de nombreux modules, des chaînes de réécriture et le fonctionnement mixte de différents langages de script, j'utilise souvent Apache. Si j'ai besoin d'une mise en cache supplémentaire de l'edge ou de politiques étendues, je place un reverse proxy devant. Ce guide est une bonne aide au démarrage : Mettre en place un reverse proxy. Il est important d'avoir une priorité propre : d'abord des en-têtes d'application corrects, ensuite une mise en cache côté serveur, enfin des couches proxy optionnelles.
Sécurité et conformité : que peut-on mettre en cache ?
Sensible Données restent toujours à l'extérieur : profils, paniers d'achat, récapitulatifs de commande, tickets, informations sur les patients, zones d'administration. Je définis des en-têtes de contrôle de cache clairs pour que les proxies et les navigateurs ne stockent pas de contenus confidentiels. Pour les cookies, j'utilise SameSite, HttpOnly et Secure, et je sépare systématiquement les chemins d'accès personnalisés. En outre, j'enregistre les accès inhabituels afin de détecter rapidement les configurations erronées. Ainsi, les performances restent élevées sans compromettre la confidentialité.
Politiques d'en-tête dans la pratique
Je définis un ensemble d'en-têtes cohérent afin que tous les niveaux agissent de la même manière et n'envoient pas d'instructions contradictoires.
- HTML (public, mais de courte durée) : Cache-Control : public, s-maxage quelques minutes, max-age plutôt 0-60s, éventuellement must-revalidate ; ETag/Last-Modified actif.
- Actifs (longue durée de vie) : Contrôle du cache : public, max-age 1 an, immutable ; versionner les noms de fichiers (empreintes digitales) pour que je puisse déployer sans purger.
- Pages personnalisées : Contrôle du cache : no-store, private ; set-cookie uniquement si nécessaire. Ne jamais partager l'en-tête d'autorisation.
- Redirections et 404 : 301 peuvent vivre longtemps, 302/307 seulement brièvement ; 404 mettre en cache brièvement, afin que les erreurs ne soient pas fixées.
- Compression : Activer Gzip/Brotli et définir Vary : Accept-Encoding pour que les variantes soient correctement séparées.
Ainsi, le comportement reste transparent - aussi bien pour les navigateurs, les proxies et le cache du serveur.
Interaction avec le CDN et le cache du navigateur
Je combine l'utilisation du serveur Mise en cache avec un CDN qui fournit des assets statiques avec des TTL longs. Pour le HTML, je définis des TTL plus courts sur le serveur et j'impose des règles différenciées dans le CDN. Dans le navigateur, je contrôle Expires, ETags et Cache-Control afin que les utilisateurs récurrents aient peu à recharger. Les noms de fichiers versionnés (Asset-Fingerprints) permettent de longues durées d'exécution sans fausses erreurs. Contenu. Je déploie les modifications via des traces de cache ou de nouvelles versions d'actifs.
Planification de la capacité et réglage du stockage
Un cache n'est efficace que si sa taille, sa disposition en mémoire et ses règles de pagination sont adaptées. J'évalue la capacité nécessaire en fonction du nombre d'objets uniques par TTL et de leur taille moyenne, et je prévois un tampon pour les pics. Dans Nginx, je détermine keys_zone (index dans la RAM), inactive (expiration sans hits) et max_size (sur disque). Sous Apache, je contrôle le chemin du cache, la taille maximale et j'utilise des outils de nettoyage.
- Mémoire dédiée : Volume/partition séparé(e) pour le cache afin de réduire la concurrence IO.
- Paramètres du système de fichiers : Les options telles que noatime réduisent les surcharges IO ; les grands inodes/blocs peuvent contenir de nombreux petits fichiers de manière plus efficace.
- Eviction : Accepter les stratégies LRU et choisir les TTL de manière à ce que les objets chauds restent.
- Préchauffage : Pinguer les chemins importants après les déploiements pour que les utilisateurs en profitent immédiatement.
- htcacheclean/Manager : Sous Apache, nettoyer régulièrement ; sous Nginx, ne pas entraver les processus du gestionnaire de cache.
La mémoire et la configuration augmentent au fur et à mesure de la croissance du site, ce qui permet de maintenir un taux de réussite stable.
Exploitation, invalidation et maintenance
Je prévois d'avoir des Processus pour la validation du cache après les déploiements, les mises à jour de contenu et les modifications de structure. Des hooks automatisés vident les chemins concernés de manière ciblée au lieu d'effacer tout le cache. Les contrôles de santé et les alarmes signalent les taux anormaux ou les codes d'erreur afin que je puisse réagir immédiatement. Je documente les règles, les responsabilités et les exceptions typiques afin de garantir des résultats cohérents. Ainsi, le système reste prévisible, rapide et facile à entretenir pour les équipes.
Méthodes d'invalidation et modèles de purge
Les options de purge diffèrent selon la pile. Je préfère les stratégies qui ne nécessitent pas d'effacement total et qui minimisent les risques.
- Invalidation basée sur le temps : s-maxage/TTL court pour HTML plus revalidation ; les assets restent longtemps car ils sont versionnés.
- Versionnement des clés : Intégrer un jeton de version (par ex. Build-ID) dans la clé de cache ; lors du déploiement, la version change, les anciens objets expirent sans purge.
- Purges ciblées : Lorsqu'ils sont disponibles, les supprimer de manière ciblée via API/PURGE ; sinon, supprimer de manière sélective les fichiers en cache et les réchauffer.
- Tagging au niveau de l'application : Attribuer des groupes/balises aux pages et invalider le groupe de manière ciblée lors de la mise à jour du contenu.
- Approche ban sur le edge : Bloquer sur la base de modèles si un reverse proxy dédié est placé en amont.
J'automatise les étapes du processus CI/CD et je tiens à disposition des protocoles permettant de comprendre quand et pourquoi le contenu a été invalidé.
Tests et assurance qualité
Avant de mettre en ligne des règles, je m'assure que le fonctionnement et la sécurité sont corrects. Je travaille dans un environnement de staging et j'effectue des tests clairement définis.
- Vérification de l'en-tête : Le contrôle du cache, Vary, ETag/Last-Modified sont-ils corrects pour chaque type de ressource ?
- Analyse des succès/échecs : Les modifications augmentent-elles le taux de réussite ? Les pages sensibles se retrouvent-elles par erreur dans le cache ?
- Cas de charge et d'erreur : Comportement sous pic de charge, dépassement de temps en amont et 5xx - est-ce que stale-if-error s'applique ?
- Variantes de l'appareil/de la langue : Les variantes sont-elles correctement séparées et correctement renvoyées ?
- Chemins pertinents pour le référencement : Gestion des 301/302, canonicals, pagination et pages de recherche non mal mises en cache.
Avec des contrôles synthétiques et des métriques d'utilisateurs réels, je m'assure que les optimisations n'entraînent pas de régression.
En bref
J'utilise le serveur Mise en cachepour diminuer les temps de réponse, réduire la charge du serveur et absorber les pics de charge de manière souveraine. Nginx convainc par son cache FastCGI et proxy rapide, Apache par sa logique de module variable et son contrôle fin. Les règles exactes pour TTL, Bypass et Purge, qui protègent les contenus personnalisés, sont décisives. Surveillance avec des En-tête me montre si les règles sont efficaces et où je dois les modifier. Avec une configuration propre, des exceptions claires et une invalidation planifiée, chaque site reste rapide, fiable et bien évolutif.


