Les guerres d'un Responsable Informatique

Vous êtes passionnés comme moi de machines basse-consommation, ARM, Atom : rendez visite à mon partenaire !

Nginx fastcgi optimisation

mardi 22 mars 2011 à 13:30 | Performance
plus vite avec nginx

Le serveur web Nginx est réellement très rapide. On peut encore améliorer la rapidité de Nginx, en mettant en oeuvre des techniques de caching fastcgi. Il existe des alternatives comme apc, php5-xcache, ... Je vous présente comment avoir un cache fastcgi, en utilisant uniquement Nginx.

Optimisation du backend web

L'optimisation backend d'un serveur web est un élément important, mais non primordiale, dans le temps de chargement d'une page web par le browser. Néanmoins, l'optimisation de l'infrastructure du serveur web, est importante pour assurer une plus grande scalabilité et ainsi permettre une montée en charge importante.

Fonctionnement d'un serveur web

Je vous propose une visite guidée dans la chaîne de génération d'une page web au sein d'un serveur ou d'un ensemble de serveurs. Notre fusée est composée généralement de 3 étages :

  • le serveur web (nginx,apache2,...), qui reçois la requête http et renverra la réponse finale vers le client
  • le moteur fastcgi, qui exécute des instructions côté serveur (php,ruby,C++,...) et génère le html résultant
  • la base de donnée qui stocke les informations qui vont permettre de générer la page finale.

performance scalabilite

Pour améliorer les performances de l'ensemble de cette fusée, il est possible d'intervenir sur ses différents étages, pour aller vers l'infini et au delà !

Première optimisation possible, est de répartir la charge des 3 étages de la chaîne du service web, sur 3 serveurs. C'est coûteux, mais nécessaire pour les gros sites.

La seconde optimisation de la performance possible, est d'éviter la sollicitation de chaque étage de la fusée, pour avoir une réponse rapide.

cache cgi

Pour cela, on va utiliser des applications caches, qui vont stocker les éléments déjà générés, voici quelques exemples :

  • memcache, va stocker la réponse à des requêtes déjà exécutées précédemment, ainsi, on évide d'interroger la base de données
  • les caches fastcgi (apc,php5-xcache,...), vont stocker les pages html déjà générées

Gestion de cache avec Nginx

Nginx offre la possibilité de gérer un cache fastcgi, qui va stocker les pages html déjà générées par un backend Php ou un backend Ruby.

Définition du cache cgi Nginx

  • Dans le fichier nginx.conf, au niveau de la section http, il faut définir le cache, la zone de stockage, sa taille
  • Créer le répertoire, avec les droits pour l'utilisateur propriétaire du process Nginx (chown www-data ./nginx en vous plaçant dans le répertoire /var/ par exemple)
http { fastcgi_cache_path /var/nginx levels=1:2 keys_zone=mycache:10m inactive=1h max_size=4g; ...

Mise en oeuvre du cache fastcgi Nginx

location ~ \.php$ { fastcgi_cache mycache; fastcgi_cache_key $host$request_uri; fastcgi_cache_valid any 1h; fastcgi_cache_use_stale off; ...

Nginx a créé une arborescence de répertoires dans /var/nginx. Dans les répertoires, Nginx stocke les fichiers html. Ils sont conservés pendant la durée indiquée dans le fichier de configuration. Si votre backend fastcgi compresse en gzip, les fichiers stockés sont compressés, ce qui libère le serveur web pour d'autres taches !

Attention, pendant la phase de développement, pensez à désactiver le cache, sinon, vos modifications ne seront pas visibles !!!

Optimisation du cache fastcgi par l'utilisation d'un RAM disque

Maintenant, on va encore optimiser le temps d'accès aux fichiers mis en cache, par la mise en cache sur un disque en RAM.

A propos de Vincent RABAH

Directeur des systemes d'information

Je suis DSI depuis 10 ans. Spécialiste en systèmes d'information et réseaux.
Expert en management, GreenIT et virtualisation de serveurs. Vous pouvez consulter l'ensemble de mon parcours.

I do speak English even if my blog is written in French ... Feel free to leave comments, I'll answer you !


Partagez cet article :



Fil des commentaires de cet article

5 commentaire(s) Commentaires »

  1. Est-ce que le cache de Nginx, ainsi configuré, peu remplacer Varnish ?

  2. Bonjour Quent1, j'ai commis une erreur il faut remplacer one par "mycache", qui est le nom de la zone de cache défini par "keys_zone" ... Désolé je corrige mon post !
    Cordialement

  3. Ne marche pas chez moi :(. Nginx ne reconnait pas "fastcgi_cache one;" (ni "fastcgi_cache on;"). Une idée?

  4. Bon article sur un élément pas très connu ou documenté de Nginx.

    Par contre j'ai repéré ce que je pense être un coquille : php5-xcache ne met pas en cache le html généré mais le code PHP compilé et si ma mémoire est bonne c'est la même chose pour apc.

    A part ça encore bravo de la part d'un confrère utilisateur de Dockstar ;)

  5. Très interessant, merci

Laisser un Commentaire

Quelle est la quatrième lettre du mot xmdiq ? :