Nginx en reverse proxy pour plusieurs blogs WordPress

J’ai installé aujourd’hui Nginx sur un serveur que je loue (non auto-administré), ce car je voulais depuis longtemps voir ce qu’il en était en terme de performances par rapport à un hébergement classique sur Apache. Pour cela, j’ai pris d’un côté un site témoin (abricocotier.fr) qui fonctionne « seulement » sur un Apache et un autre site (on l’appellera deuxieme-serveur.fr) qui est derrière un Nginx et un Apache (Nginx se chargeant de traiter l’envoi de tous les fichiers considérés comme statiques : images, javascripts, feuilles de styles, Apache tout le reste).

Pour ceux qui demandent, je n’ai pas inventé tout seul la façon de mettre tout cela en place. J’ai tenté de suivre au mieux les conseils donnés par Papygeek pour installer Nginx. Je vous recommande son billet si vous souhaitez également tenter l’aventure.

Cette image n’a pas grand chose à voir avec l’article, mais je la trouvais très jolie, d’où son placement ici 🙂

  • La mise en place fonctionnelle de Nginx en reverse proxy, devant Apache, a pris en tout et pour tout 1h30 (temps pour régler les divers problèmes compris), après lecture complète du billet. C’est donc 1h30 de tests et de résolutions de problèmes.
  • L’erreur 502 Bad Gateway signifiait pour moi que Nginx transmettait bien les requêtes, mais Apache n’était pas correctement configuré pour les traiter.
  • L’erreur 403 signifiait en gros que Nginx n’avait pas les droits pour renvoyer le fichier demandé, ou ne le trouvait pas (si le chemin vers les fichiers n’est pas correctement configuré dans le fichier de configuration par exemple) ou n’en était pas capable (par exemple si le fichier est un *.php et que Nginx n’est pas configuré pour le traiter, ça va lui poser problème).

Niveau temps de réponse.

J’attire l’attention sur le fait que les deux serveurs comparés n’ont pas du tout la même configuration, et que donc si comparaison il y a, elle est à prendre avec beaucoup de pincettes.

Édit : La configuration du serveur sur lequel est AbriCoCotier est la suivante : Athlon 3800+ (2 coeurs à 2ghz), 4Go de RAM. La configuration sur l’autre serveur est un AMD Opteron à 2,1Ghz (d’après cat /proc/cpuinfo ) et 2Go de RAM (d’après top ou free -m).

Sur le serveur où est AbriCoCotier, je n’ai qu’un Apache. Le temps de réponse d’une page d’accueil WordPress en cache (avec wp-super-cache) est le suivant :

  • Pour le fichier HTML de la page : 216ms de latence.
  • Pour le fichier CSS du thème : 84ms de latence.
  • Pour la première image chargée : 181ms de latence.

Sur l’autre serveur, la configuration est un couple Nginx en reverse proxy, et Apache derrière. Le temps de réponse d’une page en cache également est le suivant :

  • Pour le fichier HTML de la page : 412ms de latence.
  • Pour le fichier CSS du thème : 153ms de latence.
  • Pour la première image chargée : 75ms de latence.

Même si la deuxième page est plus légère que la première, et que donc, toute proportion gardée, j’aurais tendance à dire que ce test va dans le sens d’Apache, j’ai fait un second test, avec une page égale (la page de Readme.html de WordPress).

Pour le serveur d’AbriCoCotier, on a (j’ai pris le meilleur temps total sur 10 tests):

  • Total : 264ms.
  • readme.html : 58ms de latence, 113ms de download
  • install.css : 85ms de latence, 1ms de download
  • wordpress-logo.png : 78ms de latence, 14ms de download

Pour l’autre serveur, et sachant que le HTML a été traité par Apache, alors que le CSS et le PNG ont été traité par Nginx (pareil : j’ai pris le meilleur sur une dizaine de tests) :

  • Total : 215ms.
  • readme.html : 56ms de latence, 21ms de download
  • install.css : 110ms de latence, 16ms de download
  • wordpress-logo.png : 125ms de latence, 13ms de download

Donc là, le test tend à donner une légère avance à Nginx+Apache par rapport à Apache tout seul.

Mais je le répète : les deux serveurs ne sont pas matériellement comparables (celui sur lequel est AbriCoCotier doit être plus puissant), donc je ne sais pas vraiment ce que l’on peut conclure de ces tests.

Edit n°2 : au vu de ce que j’ai donné ci-dessus pour les performances « matérielles », il est compréhensible que l’Apache tienne correctement la route.

Cela dit, j’ai fait un test de la home pour chacun des sites (200 requêtes), et voilà ce que cela me donne :

Pour le premier serveur (avec abricocotier.fr dessus) :

coucou# ab -n 200 -c 5 https://www.abricocotier.fr/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.abricocotier.fr (be patient)
Completed 100 requests
Finished 200 requests

Server Software:        Apache
Server Hostname:        www.abricocotier.fr
Server Port:            80

Document Path:          /
Document Length:        47548 bytes

Concurrency Level:      5
Time taken for tests:   8.147451 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      9564400 bytes
HTML transferred:       9509600 bytes
Requests per second:    24.55 [#/sec] (mean)
Time per request:       203.686 [ms] (mean)
Time per request:       40.737 [ms] (mean, across all concurrent requests)
Transfer rate:          1146.37 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    1   1.1      1      10
Processing:    86  200  78.4    183     499
Waiting:       72  181  76.5    165     469
Total:         88  202  78.5    184     500

Percentage of the requests served within a certain time (ms)
  50%    184
  66%    226
  75%    253
  80%    266
  90%    318
  95%    351
  98%    396
  99%    410
 100%    500 (longest request)

Pour le deuxième serveur (appelons le deuxieme-serveur.fr ):

coucou:~# ab -n 200 -c 5 deuxieme-serveur.fr
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking deuxieme-serveur.fr (be patient)
Completed 100 requests
Finished 200 requests

Server Software:        nginx/0.5.33
Server Hostname:        deuxieme-serveur.fr
Server Port:            80

Document Path:          /
Document Length:        4813 bytes

Concurrency Level:      5
Time taken for tests:   3.885465 seconds
Complete requests:      200
Failed requests:        195
   (Connect: 0, Length: 195, Exceptions: 0)
Write errors:           0
Total transferred:      1031170 bytes
HTML transferred:       966500 bytes
Requests per second:    51.47 [#/sec] (mean)
Time per request:       97.137 [ms] (mean)
Time per request:       19.427 [ms] (mean, across all concurrent requests)
Transfer rate:          259.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   9.8      0      98
Processing:    10   95 266.8     55    1832
Waiting:        9   69 263.1     26    1797
Total:         10   96 274.9     55    1890

Percentage of the requests served within a certain time (ms)
  50%     55
  66%     59
  75%     62
  80%     64
  90%     71
  95%     79
  98%   1794
  99%   1832
 100%   1890 (longest request)

Au final, et si je lis correctement ce qui est retourné par le benchmark d’Apache, le serveur d’AbriCoCotier est capable de traiter 24 requêtes par secondes contre 51 pour celui avec Nginx+Apache.

Je ne suis pas certain que ce test soit correct, dans la mesure où je ne maitrise pas bien les outils abordés ici, mais je serais preneur d’un conseil ou de plusieurs si vous en avez.

Édit du 20 mai 2010 : Une chose qui peut être assez énervante, c’est de se faire « prendre » sa bande passante par d’autres sites, qui vont afficher sur leurs sites des images ou d’autres documents qui sont hébergés chez vous. Cela s’appelle le hotlinking (on parle d’image hotlinking).

Sur le site de Nginx, on trouve cela :
If you need to redirect referers from spefic site only, then you may use map:

http {

    map  $referer  $forbidden {

         hostnames;
         default           0;

         *.hotlink1.com    1;
         www.hotlink2.com/ 1;
         .hotlink3.com/    1;

         include   hotlink.conf;
    }

    server {

         set $referer "";
         if ($http_referer ~* '^<a href="http://%28[%5E/">http://([^:/</a>]+)') {
             set $referer $1;
         }

         location ...

         location ~* ^.+\.(jpg|jpeg|gif ... {

             if ($forbidden) {
                 rewrite  ^  <a href="http://.../;">http://...;</a>
             }

             root  ...
             ...
         }

hotlink.conf:

*.hotlink4.com    1;
www.hotlink5.com/ 1;
.hotlink6.com/    1;

[Image]

Edit du 20 juillet 2010 : Mise à jour de Nginx avec le configure suivant :

./configure –with-http_gzip_static_module –with-http_ssl_module –with-http_dav_module –with-http_sub_module

11 réflexions sur « Nginx en reverse proxy pour plusieurs blogs WordPress »

  1. @Insolite du Geek: Disons que :

    1. Depuis le temps que je parle d’optimisation des performances ou du temps d’affichage, parler de Nginx rentre tout à fait dans la lignée de ce que j’ai pu écrire sur le sujet.
    2. Tout le monde disant que c’est un serveur rapide, je voulais voir ce qu’il en serait.
    3. Savoir installer un serveur, le configurer, faire un « reverse proxy » au sein d’un même serveur, ça semble peut-être con, mais pour quelqu’un qui cherche à obtenir un diplôme en informatique (moi, en l’occurrence), ça me semble être une des bases (que je n’avais pas encore).

    RépondreRépondre
  2. En fait, il est normal que les temps de génération soient supérieurs, étant donné que NGINX est utilisé en tant que reverse proxy (un layer en plus du serveur web).

    Pour des perfs plus significatives, tu devrais plutôt utiliser NGINX en serveur web direct, avec PHP-FPM, qui augmente réellement les performances. Et aussi prendre des serveurs à performances strictement égales (fais-le sur ton laptop par exemple)

    RépondreRépondre
  3. @Bastien: Oui, j’ai vu ça sur le net. Malheureusement, je n’ai pas trouvé de tutoriel relativement clair/simple pour mettre cela en place (toutefois je suis preneur).

    RépondreRépondre
  4. Bonjour,

    Juste pour dire que korben.info a fait l’installation d’un outil nginx sur son serveur et qu’il en est très content (pour ce que je me souviens).

    Grosso modo si j’ai bien retenu :
    – Plus de traitements de page par seconde
    – Plus rapide de manière général (affichage, etc…)

    Voilà, le mieux reste encore d’aller sur son site ou d’en discuter avec lui 😉

    Alexandre

    RépondreRépondre
  5. Je pense que la différence de serveur joue (en terme de puissance), mais que le couple nginx + apache fonctionne mieux qu’Apache seul.

    RépondreRépondre
  6. Bonjour, j’essaye d’installer gninx + php-fpm + apc sur un serveur Centos5 avec un Plesk 9..

    Quelqu’un sait si il y a des particularités propres à Plesk 9 pour faire cela ?

    C’est dans le but d’optimiser un blog WordPress avec +15000 articles, et un millions de pages vues / mois

    RépondreRépondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.