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)

Creer son certificat ssl wildcard auto-signé

Pré-requis :
- avoir les librairies openssl d’installées ( sous debian : “apt-get install openssl ssl-cert” )
- avoir compris ce qu’est openssl

Mise en place de l’arborescence néccessaire :

mkdir --parent /etc/ssl/chains
mkdir --parent /etc/ssl/certificates
mkdir --parent /etc/ssl/private
mkdir --parent /etc/ssl/requests
mkdir --parent /etc/ssl/roots

Mise en place des droits qui vont bien

chown -R root:ssl-cert /etc/ssl/private
chmod 710 /etc/ssl/private
chmod 440 /etc/ssl/private/*

Création de la clef secrète

root@serveur:/# cd /etc/ssl/private/
root@serveur:/etc/ssl/private# openssl genrsa -des3 -out domaine.com.key 2048
Generating RSA private key, 2048 bit long modulus
...............................+++
..........................................+++
e is 65537 (0x10001)
Enter pass phrase for domaine.com.key:
Verifying - Enter pass phrase for domaine.com.key:

Création du CSR ( “Certificate Signing Request” ou grosso modo Certificat à signer )

root@serveur:/etc/ssl/private# cd /etc/ssl/requests/
root@serveur:/etc/ssl/requests# openssl req -new -key ../private/domaine.com.key -out domaine.csr
Enter pass phrase for ../private/domaine.com.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Nord-Pas-De-Calais
Locality Name (eg, city) []:Roubaix
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mon Domaine
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:*.domaine.com
Email Address []:webmaster@domaine.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

On enleve maintenant la protection par le password ( c’est plus pratique et c’est uniquement néccessaire pour crééer le CSR )

root@serveur:/etc/ssl/requests# cd /etc/ssl/private/
root@serveur:/etc/ssl/private# cp domaine.com.key domaine.com.key.orig
root@serveur:/etc/ssl/private# openssl rsa -in domaine.com.key.orig -out domaine.com.key
Enter pass phrase for faistonweb.com.key.orig:
writing RSA key

Signons ( validons ), nous même notre certificat :

root@serveur:/etc/ssl/private# cd /etc/ssl/certificates/
root@serveur:/etc/ssl/certificates# openssl x509 -req -days 3650 -in ../requests/domaine.csr -signkey ../private/domaine.com.key -out domaine.crt
Signature ok
subject=/C=FR/ST=Nord-Pas\xC3-De-Calais/L=Roubaix/O=Mon Domaine/CN=*.domaine.com/emailAddress=webmaster@domaine.com
Getting Private key

Ca y est, vous pouvez encrypter comme des grands .. :)

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.

Création d’une base mysql en ligne de commande

Pour créé une base Mysql et pouvoir l’utiliser, c’est relativement simple, on va utiliser l’outil mysql de base pour : créé une base et donner les droits d’utilisation à un utilisateur.

root@serveur:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.1.63-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database testjoomla; Query OK, 1 row affected (0.00 sec)
mysql> grant all on testjoomla.* to 'testjoomla'@'localhost' identified by 'password'; Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

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.

Utilisation d’aptitude

Sur les distributions utilisant apt ( paquets .deb ), il est aussi possible d’utiliser la surcouche aptitude. C’est une façon simple et pratique de gérer l’installation/désinstallation et mise à jour des logiciels.

Voici quelques exemples d’utilisation.

Mettre à jour la liste des paquets ( logiciels disponibles )

root@server:~# aptitude update
Hit http://debian.mirrors.ovh.net squeeze Release.gpg
Ign http://debian.mirrors.ovh.net/debian/ squeeze/main Translation-en
Ign http://debian.mirrors.ovh.net/debian/ squeeze/main Translation-en_GB
Hit http://debian.mirrors.ovh.net squeeze Release
Hit http://debian.mirrors.ovh.net squeeze/main Sources      
Hit http://debian.mirrors.ovh.net squeeze/main amd64 Packages
Get:1 http://security.debian.org squeeze/updates Release.gpg [836 B]
Ign http://security.debian.org/ squeeze/updates/main Translation-en
Ign http://security.debian.org/ squeeze/updates/main Translation-en_GB
Get:2 http://security.debian.org squeeze/updates Release [86.9 kB]
Get:3 http://security.debian.org squeeze/updates/main Sources [90.3 kB]
Get:4 http://security.debian.org squeeze/updates/main amd64 Packages [270 kB]
Fetched 448 kB in 0s (691 kB/s)

Installer les dernières versions disponibles des paquets installés

root@server:~# aptitude upgrade
The following packages will be upgraded:
....
13 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,378 kB of archives. After unpacking 0 B will be used.
Do you want to continue? [Y/n/?] Y
Get:1 http://security.debian.org/ squeeze/updates/main lwresd amd64 1:9.7.3.dfsg-1~squeeze8 [244 kB]
Get:2 http://security.debian.org/ squeeze/updates/main bind9 amd64 1:9.7.3.dfsg-1~squeeze8 [355 kB]
....
Fetched 2,378 kB in 0s (2,454 kB/s)
Reading changelogs... Done
Preconfiguring packages ...
(Reading database ... 22898 files and directories currently installed.)
Preparing to replace lwresd 1:9.7.3.dfsg-1~squeeze7 (using .../lwresd_1%3a9.7.3.dfsg-1~squeeze8_amd64.deb) ...
Unpacking replacement lwresd ...
....
Current status: 0 updates [-13].

Recherche d’un paquet

root@ks3267918:~# aptitude search apache
p   apache2                                                     - Apache HTTP Server metapackage
p   apache2-dbg                                                 - Apache debugging symbols
v   apache2-dev                                                 -
p   apache2-doc                                                 - Apache HTTP Server documentation       

Installation d’un paquet

root@ks3267918:~# aptitude install htop
The following NEW packages will be installed:
  htop
0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 63.7 kB of archives. After unpacking 209 kB will be used.
Get:1 http://debian.mirrors.ovh.net/debian/ squeeze/main htop amd64 0.8.3-1 [63.7 kB]
Fetched 63.7 kB in 0s (105 kB/s)
Selecting previously deselected package htop.
(Reading database ... 22898 files and directories currently installed.)
Unpacking htop (from .../htop_0.8.3-1_amd64.deb) ...
Processing triggers for man-db ...
Setting up htop (0.8.3-1) ...

Partionnement “propre” sur Kimsufi OVH

De base les serveurs fournis par OVH sous Debian dans le cadre de leur offre Kimsufi ont un partionnement un poil non pratique dans le cadre d’une utilisation pour un serveur. En effet, on a une partition racine de taille correcte mais quasi tout l’espace alloué pour /home .. Donc à part les gens qui vont faire des seedbox, je ne vois personnellement pas trop l’intérêt.

Voici donc un guide pas à pas pour re-installer un serveur Kimsufi avec un système de partitions plus adaptées pour un usage en tant que serveur.

Donc, se loguer sur le manager OVH, sélectionnez votre serveur dédié Kimsufi.

Sélectionnez votre serveur dédié Kimsufi

Vous devriez arriver sur la page suivante

Récapitulatif Kimsufi

La il faut donc aller dans la liste des services, et sélectionner “Réinstaller / Changer d’OS”

Réinstaller l'OS

Je vous suggère donc de choisir une Debian 6.0 de base en 64 bits tel que suit

Choix du système d'exploitation

Nous voulons donc un partitionnement personnalisé

Partitionnement personnalisé

Nous allons donc commencer par une partition primaire de 20Go pour /

Ensuite un swap de 2 * 16Go ( 2 * la RAM sur chaque disque .. )

Ensuite nous allons ajouter une partition de 20Go pour /usr

 

Nous allons faire de même pour /home ( 20Go ), /tmp ( 1Go ) et enfin nous allons tout l’espace disque restant à /var pour obtenir le résultat suivant

Il ne reste plus qu’à lancer la réinstallation .. :) Bonne utilisation ! :)