Parle moi en russe

installer serveur web nginx

Voila depuis quelques jours je me suis mis au russe . Pourquoi le russe il semblerait que la vodka soit bonne et les femmes plutôt grande et blonde . Donc il devient primordial pour moi d’apprendre cette langue 🙂 .

Haltes aux stéréotypes et concentrons nous un peu sur Nginx qui vous le savez tous est un navigateur http/reverse proxy.

La principale fonctionnalité que permet nginx est de pouvoir séparer le contenu statique du contenu dynamique comme le ferais lighthttpd et encore apache via le mod_proxy.

Installation

On commence déjà par modifier notre source.list

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

Je ne vous dis pas qu’il faut faire un update de votre source.list

apt-get install nginx php5-cgi

Configuration du lancement des process php

Créer un fichier php5-cgi dans /etc/init.d/ et coller y le contenu de ce fichier que vous pouvez télécharger ici .

Mettre les droits en exécution puis ajouter le script au démarrage automatique

cd /etc/init.d/
chmod +x php5-cgi
update-rc.d php-fcgi defaults

Configuration global de nginx

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_static       on;
    gzip_vary         on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

 

Par rapport à une conf par défaut j’ai rajouté la compression gzip et deux includes pour ne pas être trop perdu par rapport à apache mais ce dernier point n’est qu’un détails.

Configuration du FastCGI

fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Configuration du vhost pour WordPress

server {
    listen   80;
    server_name  monsite.com www.monsite.com;
                root   /var/www/path.mon.site.com;
                index index.php index.htm index.html;

#LOGS
    access_log  /var/log/nginx/monsite.com/logs/nginx_access.log main;
    error_log  /var/log/nginx/monsite.com/logs/nginx_error.log;

#Définiton des paramètres cgi
location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }

include /etc/nginx/conf.d/wordpress;
include	/etc/nginx/conf.d/security;

if (!-e $request_filename) {
           rewrite ^(.+)$ /index.php?q=$1 last;
        	}
#Redirige monsite.com vers www.monsite.com
if ($host ~* ^monsite\.com$) {
    rewrite ^(.*) http://www.monsite.com$1 permanent;
    break;
		}

On peut apercevoir deux includes . Contenu du fichier security

location ~ /\. {
                deny  all;
        }

Le contenu du fichier WordPress sera vu un peu plus tard .

A ce moment de l’histoire vous avez nginx et php5-cgi qui sont fonctionnels .

Bench apache vs nginx

L’heure du verdict

Avec Nginx

$ ab -c 5 -t 30 http://www.robertain.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.robertain.com (be patient)
Finished 67 requests

Server Software:        nginx/1.2.0
Server Hostname:        www.robertain.com
Server Port:            80

Document Path:          /
Document Length:        70329 bytes

Concurrency Level:      5
Time taken for tests:   30.171 seconds
Complete requests:      67
Failed requests:        48
   (Connect: 0, Receive: 0, Length: 48, Exceptions: 0)
Write errors:           0
Total transferred:      4976472 bytes
HTML transferred:       4957231 bytes
Requests per second:    2.22 [#/sec] (mean)
Time per request:       2251.580 [ms] (mean)
Time per request:       450.316 [ms] (mean, across all concurrent requests)
Transfer rate:          161.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       25   38  15.3     35      87
Processing:  1821 2086  89.1   2101    2268
Waiting:      428  750  72.7    751     997
Total:       1845 2124  96.3   2137    2355

Percentage of the requests served within a certain time (ms)
  50%   2137
  66%   2147
  75%   2162
  80%   2163
  90%   2190
  95%   2306
  98%   2335
  99%   2355
 100%   2355 (longest request)

Mon CPU est au taquet près de 90% utilisation de la RAM plutôt correct  . 95% des requêtes sont servit en 2306 ms

Avec Apache

$ ab -c 5 -t 30 http://www.robertain.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.robertain.com (be patient)
Finished 56 requests

Server Software:        Apache
Server Hostname:        www.robertain.com
Server Port:            80

Document Path:          /
Document Length:        70329 bytes

Concurrency Level:      5
Time taken for tests:   31.623 seconds
Complete requests:      56
Failed requests:        40
   (Connect: 0, Receive: 0, Length: 40, Exceptions: 0)
Write errors:           0
Total transferred:      4198282 bytes
HTML transferred:       4183102 bytes
Requests per second:    1.77 [#/sec] (mean)
Time per request:       2823.504 [ms] (mean)
Time per request:       564.701 [ms] (mean, across all concurrent requests)
Transfer rate:          129.65 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       25   30   5.5     28      50
Processing:  2100 2643 819.5   2208    4986
Waiting:      730 1091 581.2    819    2826
Total:       2125 2673 819.0   2247    5012

Percentage of the requests served within a certain time (ms)
  50%   2247
  66%   2499
  75%   2817
  80%   2984
  90%   3483
  95%   4971
  98%   4989
  99%   5012
 100%   5012 (longest request)

Le CPU a une charge quasi similaire à Nginx seul . 95% des requêtes sont servit en près de 5000 ms . Ce qui correspond à un gain de 46% pour Nginx .Le nombre de page par secondes est également supérieur pour Nginx . On passe de 1.77 pour apache à 2.22 pour Nginx.

Ceci ne sont que des bench à base de ApacheBenchmark les résultats sont des bons indicateurs mais pour des bench plus poussés (= euros) . Je vous conseil des outils plus adaptés .

Allons plus loin

Comme vu plus haut nous avions un include qui redirige vers un fichier wordpress . Ce fichier n’est autre que nginx.conf qui se trouve à la racine de votre site . Il vous suffit de le copier dans le bon répertoire .

Alors pour optimiser davantage notre blog , wordpress fournit une multitude de greffons . Dont le WP total cache . Qui comme son nom l’indique est un système de cache qui nous permettra d’accélérer grandement les perf de notre blog .

Il faut suffit d’installer le plugin depuis votre interface rien de bien compliqué . Si vous ne savez pas le faire voici pour vous .

Bench avec option PageCache du WP TotalCache

Avec nginx et WP total cache avec option PageCache

ab -c 5 -t 30 http://www.robertain.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.robertain.com (be patient)
Finished 214 requests

Server Software:        nginx/1.2.0
Server Hostname:        www.robertain.com
Server Port:            80

Document Path:          /
Document Length:        70537 bytes

Concurrency Level:      5
Time taken for tests:   30.030 seconds
Complete requests:      214
Failed requests:        0
Write errors:           0
Total transferred:      15239382 bytes
HTML transferred:       15173110 bytes
Requests per second:    7.13 [#/sec] (mean)
Time per request:       701.625 [ms] (mean)
Time per request:       140.325 [ms] (mean, across all concurrent requests)
Transfer rate:          495.59 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       23   53 205.3     35    3027
Processing:   312  644 567.2    514    4891
Waiting:       26   42  34.4     37     448
Total:        339  697 606.1    554    4927

Percentage of the requests served within a certain time (ms)
  50%    554
  66%    563
  75%    567
  80%    580
  90%    700
  95%   2044
  98%   3011
  99%   3583
 100%   4927 (longest request)

Les chiffres parlent d’eux mêmes non ? Nous avons un gain énorme sur le nombre de page traité à la seconde 7.17 contre 2.22 avec nginx sans cache . 95% des requetes sont servis en près de 2000ms ce qui correspond à un gain de près de 50% par rapport à apache . Et un gain de près de 88% par rapport à Nginx sans cache .

Cerise sur le gateau le CPU se touche complétement . Je n’éxcéde pas les 5% et le load est inférieur à 0.10 .

Le gain en perf avec le WP total cache est vraiment excellent . Biensur cela me pousse à voir un peu les autres options .

T’en veux encore un peu

Bench avec l’option Minify + PageCache activé

ab -c 5 -t 30 http://www.robertain.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.robertain.com (be patient)
Finished 246 requests

Server Software:        nginx/1.2.0
Server Hostname:        www.robertain.com
Server Port:            80

Document Path:          /
Document Length:        70523 bytes

Concurrency Level:      5
Time taken for tests:   30.012 seconds
Complete requests:      246
Failed requests:        245
   (Connect: 0, Receive: 0, Length: 245, Exceptions: 0)
Write errors:           0
Total transferred:      17604020 bytes
HTML transferred:       17527760 bytes
Requests per second:    8.20 [#/sec] (mean)
Time per request:       609.992 [ms] (mean)
Time per request:       121.998 [ms] (mean, across all concurrent requests)
Transfer rate:          572.83 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       24   36   8.7     35      68
Processing:   285  567 321.1    509    2802
Waiting:       26   80 291.8     36    2124
Total:        316  603 319.8    544    2826

Percentage of the requests served within a certain time (ms)
  50%    544
  66%    554
  75%    562
  80%    573
  90%    625
  95%    809
  98%   2562
  99%   2638
 100%   2826 (longest request)

La on dit Jackpot , cela se passe de commentaire 🙂 .

Conclusion

La migration de apache vers nginx n’est pas plus compliqué qu’une migration de nagios vers shinken mais nécessite un peu plus d’investissement .

Coté perf les résultat sont la . Si vous utiliser WordPress je vous conseil chaudement le plugins Wp Total Cache.

Related posts

4 Thoughts to “Parle moi en russe”

  1. J’ai pas compris le rapport avec la Russie, c’était juste pour m’attirer sur le blog c’est ça ? 🙂

    1. Le developpeur de Nginx est russe et pour la vodka ca me paraissait bien 🙂

  2. geek85

    pour le dernier bench,
    Complete requests: 246
    Failed requests: 245

    c’est pas cool qu’il y ai autant de requêtes en erreur, non?

    1. A l’époque j’avais trouvé ceci
      http://stackoverflow.com/questions/579450/load-testing-with-ab-fake-failed-requests-length
      Élément à prendre également en compte
      Failed requests: 245
      (Connect: 0, Receive: 0, Length: 245, Exceptions: 0)

Leave a Comment