Tester basiquement la tenue de charge d’un site web

Pré-requis : une machine sous linux/freebsd avec une bonne connectivité ( latence surtout et débit ).

Pour tester de façon basique et rapide, la tenue de charge d’une machine, apache fourni l’outil ab ( Apache Benchmark ).

Il permet d’ouvrir X connections simultanées sur un site internet de faire Y requêtes. Pour des tests plus élaborés ( scénarios de navigation ), je vous conseille de vous tourner vers jmeter.

Dans le même temps, pour obtenir les meilleurs résultats, il vous faut monitorer votre machine ( article a venir .. ) afin de pouvoir analyser finement son comportement et éventuellement l’optimiser plus ..

Ainsi, on va commencer petit :

guillaume@mars:~ # ab -n1000 -c 10 http://test-joomla.domaine.com/
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking test-joomla.domaine.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software:        Apache/2.2.16
Server Hostname:        test-joomla.domaine.com
Server Port:            80
Document Path:          /
Document Length:        15155 bytes
Concurrency Level:      10
Time taken for tests:   42.77887 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      15558543 bytes
HTML transferred:       15170155 bytes
Requests per second:    23.77 [#/sec] (mean)
Time per request:       420.779 [ms] (mean)
Time per request:       42.078 [ms] (mean, across all concurrent requests)
Transfer rate:          361.07 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4    4   0.4      4       7
Processing:   222  414  58.0    413     835
Waiting:      211  381  48.1    383     524
Total:        226  418  58.0    417     839
Percentage of the requests served within a certain time (ms)
  50%    417
  66%    439
  75%    452
  80%    462
  90%    481
  95%    500
  98%    522
  99%    555
 100%    839 (longest request)

Le serveur est donc capable de nous servir la page d’accueil jusqu’à 23 fois à la seconde, en prenant 42ms par requête. Par ailleurs, effectivement des outils de monitoring montrent une utilisation autour des 60 pourcent, ce qui semble logique au vu de nos 10 requêtes concurrentes..

On va re-essayer avec 23 requetes concurrentes :

yomgui@mars:~ # ab -n2000 -c 23 http://test-joomla.faistonweb.com/
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking test-joomla.faistonweb.com (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Finished 2000 requests
Server Software:        Apache/2.2.16
Server Hostname:        test-joomla.faistonweb.com
Server Port:            80
Document Path:          /
Document Length:        15155 bytes
Concurrency Level:      23
Time taken for tests:   84.575933 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      31101543 bytes
HTML transferred:       30325155 bytes
Requests per second:    23.65 [#/sec] (mean)
Time per request:       972.623 [ms] (mean)
Time per request:       42.288 [ms] (mean, across all concurrent requests)
Transfer rate:          359.11 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4   68 435.2      4    3004
Processing:   391  898 163.8    941    1563
Waiting:      348  821 142.1    867    1107
Total:        395  967 472.6    946    4117
Percentage of the requests served within a certain time (ms)
  50%    946
  66%    974
  75%    993
  80%   1005
  90%   1042
  95%   1081
  98%   3876
  99%   3957
 100%   4117 (longest request)

Hebergement Joomla basique sur serveur dédié

Pré-requis :
- un serveur de type lamp
- une base de donnée mysql

Téléchargement de joomla

root@serveur:/# cd /var/www/serveur.domaine.com/
root@serveur:/var/www/serveur.domaine.com# ls
root@serveur:/var/www/serveur.domaine.com# wget http://joomlacode.org/gf/download/frsrelease/17715/77262/Joomla_2.5.8-Stable-Full_Package.zip
--2012-11-15 19:56:41--  http://joomlacode.org/gf/download/frsrelease/17715/77262/Joomla_2.5.8-Stable-Full_Package.zip
Resolving joomlacode.org... 206.123.111.164
Connecting to joomlacode.org|206.123.111.164|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://downloads.joomlacode.org/frsrelease/7/7/2/77262/Joomla_2.5.8-Stable-Full_Package.zip [following]
--2012-11-15 19:56:42--  http://downloads.joomlacode.org/frsrelease/7/7/2/77262/Joomla_2.5.8-Stable-Full_Package.zip
Resolving downloads.joomlacode.org... 206.123.111.167
Connecting to downloads.joomlacode.org|206.123.111.167|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7921714 (7.6M) [application/zip]
Saving to: `Joomla_2.5.8-Stable-Full_Package.zip'
100%[==============================================================================================>] 7,921,714   3.10M/s   in 2.4s
2012-11-15 19:56:45 (3.10 MB/s) - `Joomla_2.5.8-Stable-Full_Package.zip' saved [7921714/7921714]

Extraction

root@serveur:/var/www/serveur.domaine.com# unzip Joomla_2.5.8-Stable-Full_Package.zip
...
root@serveur:/var/www/serveur.domaine.com#

Ré-attribution du propriétaire correct :

 chown -fR www-data *
root@serveur:/var/www/serveur.domaine.com#

Il ne vous reste plus qu’à ouvrir votre navigateur favori, vous connecter sur http://serveur.domaine.com et vous laisser guider pour finaliser l’installation.

Mise en place d’un lamp ( Linux / Apache / Mysql / Php )

Pré-requis : un serveur linux ( on utilisera ici une Debian 6.0 ) sans rien d’installer dessus.

Pour la suite de l’article, on dira que le serveur a une entrée dns correctement configurée ( ainsi que le reverse ) pour serveur.domaine.com

Installation des logiciels

Ca, on utilise simplement apt et c’est reglé ;)

root@serveur:/home# apt-get install apache2 libapache2-mod-php5 php5 php5-gd php5-mysql mysql-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common fontconfig-config heirloom-mailx libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libfontconfig1 libgd2-xpm libhtml-template-perl libjpeg62
  libmysqlclient16 libnet-daemon-perl libonig2 libplrpc-perl libpng12-0 libqdbm14 libt1-5 libx11-6 libx11-data libxpm4
  mysql-client-5.1 mysql-common mysql-server-5.1 mysql-server-core-5.1 php5-cli php5-common php5-suhosin ssl-cert ttf-dejavu-core
Suggested packages:
  apache2-doc apache2-suexec apache2-suexec-custom exim4 mail-transport-agent php-pear libgd-tools libipc-sharedcache-perl
  libterm-readkey-perl tinyca openssl-blacklist
Recommended packages:
  mailx
The following NEW packages will be installed:
  apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common fontconfig-config heirloom-mailx libapache2-mod-php5
  libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libfontconfig1 libgd2-xpm
  libhtml-template-perl libjpeg62 libmysqlclient16 libnet-daemon-perl libonig2 libplrpc-perl libpng12-0 libqdbm14 libt1-5 libx11-6
  libx11-data libxpm4 mysql-client-5.1 mysql-common mysql-server mysql-server-5.1 mysql-server-core-5.1 php5 php5-cli php5-common
  php5-gd php5-mysql php5-suhosin ssl-cert ttf-dejavu-core
0 upgraded, 41 newly installed, 0 to remove and 0 not upgraded.
Need to get 37.3 MB of archives.
After this operation, 96.8 MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
....

On verifie que les services tournent bien :

root@serveur:/home# netstat -an | grep LISTEN | egrep "(80|3306)"
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN

Il semblerait qu’on ait bien quelque chose qui ecoute sur le port 3306 et uniquement sur localhost, le serveur mysql à bien l’air installé.

De même pour le port 80, on doit donc donc avoir apache de lancé. Il suffit de vérifier à l’aide d’un navigateur/telnet que monserveur.mondomaine.com réponds bien et affiche bien “It Works”

Les choses sérieuses, création d’un premier site de test ..

Mise en place de l’arborescence des répertoires

root@serveur:/# mkdir /var/www/www.domaine.com
root@serveur:/# mv /var/www/index.html /var/www/www.domaine.com

On met les droits qui vont bien

root@serveur:/# chown -fR www-data:www-data /var/www/*
root@serveur:/# chmod -fR g+rwxs /var/www/*
root@serveur:/# chmod -fR o-rwx /var/www/*

Prendre votre éditeur de texte préféré pour éditer le fichier /etc/apache2/sites-available afin d’obtenir :

<VirtualHost *:80>
        ServerAdmin webmaster@domaine.com
        ServerName serveur.domaine.com
        DocumentRoot /var/www/serveur.domaine.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/serveur.domaine.com/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/serveur.domaine.com-error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/serveur.domaine.com-access.log combined
</VirtualHost>

On demande à apache de verifier la configuration :

root@srv1:~# apachectl configtest
Syntax OK

Ne reste plus, qu’a lui faire prendre en compte

root@serveur:/# /etc/init.d/apache2 reload
Reloading web server config: apache2.