Menu

Monter un serveur web très performant

18 novembre 2016 - Internet, Linux, Optimiser, Virtualisation
Monter un serveur web très performant

 


I.   Présentation

 

Nous allons monter un serveur web complet faisant tourner WordPress. Ce qui implique du PHP et une base de donnée de plus nous utiliseront un système pour faire du cache.

Détaillons un peu: Le serveur web se fera par le biais de Nginx, le PHP tournera grâce à HHVM, la base de donnée sera une Mariadb et Varnish s’occupera du cache. Cette infrastructure tournera uniquement sur des conteneurs LXC (implémenté dans Proxmox).

Nous allons avoir 3 conteneurs:

Voici schématiquement ce que cela donnera:

Architecture souhaitée

 


II.   Préparation des conteneurs

 

Si vous ne savez pas comment en créer, petite piqûre de rappel ici.

 

Nous créons donc 3 conteneurs Debian 8 jessie. Puis nous installons nos différents services dessus.

 

On met à jour à jour nos debians en utilisant cette technique pour accélérer cette étape.

 


III.   ct-mariadb

 

Pour installer Mariadb, il faut ajouter les sources, et la il suffit d’aller sur leur site et de suivre les instructions: Mariadb

apt-get install software-properties-common
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb [arch=amd64,i386] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main'

Puis on recharge les sources et on installe mariadb:

apt-get update
apt-get install mariadb-server

 

On sécurise l’installation:

mysql_secure_installation

 

On créé notre base de donnée pour notre futur wordpress:

mysql -u root -p
create database wordpress;
create user wpuser@localhost identified by 'wordpress';
grant all privileges on wordpress.* to wpuser@localhost identified by 'wordpress';
flush privileges;
exit;

 

On donne à l’utilisateur wpuser le droit de se connecter à la base de donnée depuis le conteneur ct-nginx-hhvm en 192.168.1.15 et la futur ct-varnish  en 192.168.1.14

grant all privileges on wordpress.* to wpuser@192.168.1.15 identified by 'wordpress';
grant all privileges on wordpress.* to wpuser@192.168.1.14 identified by 'wordpress';
flush privileges;
exit;

 

On va autoriser mariadb à être accessible à distance:

nano /etc/mysql/my.cnf

Les valeurs inportantes:

On redemarre mariadb:

service mysql restart

 


IV.   ct-nginx-hhvm

 

Pour l’installation de nginx et hhvm  je vous renvoi directement à un de mes précédemment articles qui traite du sujet. (Oui je suis un peu fainéant 😛 )

 

Nous allons créer le fichier de conf pour notre site wordpress:

nano /etc/nginx/conf.d/wordpress.conf

server {
listen 80 ;

root /usr/share/nginx/html/wordpress;
index index.php index.html index.htm;

access_log /var/log/nginx/wordpress-access.log;
error_log /var/log/nginx/wordpress-error.log;

server_name wordpress;
include /etc/nginx/hhvm.conf;

location / {
try_files $uri $uri/ /index.php?$args;
}
}

 

on va télécharger WordPress et le mettre dans le bon dossier:

cd /usr/share/nginx/html

wget https://fr.wordpress.org/wordpress-4.6.1-fr_FR.tar.gz
tar -xvf wordpress-4.6.1-fr_FR.tar.gz
chown www-data:www-data -R wordpress

 

On vérifie la configuration de notre nginx puis on le redémarre

nginx -t
/etc/init.d/nginx restart

 

On va aller sur notre navigateur et accéder à http://192.168.1.15

La nous devons tomber sur la configuration de WordPress. Ici je vous laisse faire, penser que votre base de donnée n’est pas en localhost mais en 192.168.1.11

 

 


V.   ct-varnish

 

Une fois le WordPress fonctionnel on passe à Varnish

 

Nous allons ajouter les sources pour avoir la dernière version:

nano /etc/apt/sources.list.d/varnish.list
deb https://repo.varnish-cache.org/debian/ jessie varnish-4.1

 

On installe le support du https pour les sources et on installe la clé:

apt-get install curl apt-transport-https
curl https://repo.varnish-cache.org/GPG-key.txt | apt-key add -

 

On recharge les sources puis on install varnish:

apt-get update && apt-get install varnish -y

 

On va configurer varnish pour qu’il écoute sur le port 80 et configurer quelques options:

nano /etc/default/varnish

DAEMON_OPTS= »-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-p thread_pools=2 \
-p thread_pool_min=25 \
-p thread_pool_max=250 \
-p thread_pool_add_delay=2 \
-p timeout_linger=0.050 \
-p cli_timeout=40 \
-s malloc,256m »

Je suis très loin d’être un expert et de maîtriser varnish je vous laisse surfer sur le web pour récolter les infos nécessaires comme j’ai pu le faire 😉

 

Maintenant nous allons configurer le fichier vcl qui permet de faire le cache ici encore je me suis servi tu tuto de nicolargo et surtout de son example de fichier vcl pour wordpress ici

On va renommer le fichier par défaut pour conserver l’original :

cd /etc/varnish/

mv default.vcl default.vcl.bak

 

il ne vous reste plus qu’a copier coller ou télécharger le fichier vcl et le renommer en default.vcl

On redémarrer varnish:

/etc/init.d/varnish restart

 

Et voila tout est prêt votre WordPress est maintenant accessible sur http://192.168.1.14

 


VI.   Test de performance

 

Sur un autre conteneur (tant qu’à faire) j’ai installer un les deux outils suivants:

et j’ai donc créer deux pages dans mon WordPress:

Pour les photos il y en a 5 :

 

Pour le test avec ab: 

-n = nombre de requêtes que l’on va envoyer et -c = Nombre de connexion simultanées

 

Pour le test avec siege:

Où -d1 = 1 seconde de delai entre chaque cycle -c = nombre de connexions simultanées -r100 = on refais le test 100 fois -t24S = test pendant 24 secondes

 

Et sans plus attendre voici les résultats:

ab:

Le temps que le test à pris sur chacune des pages (light et big) Le nombre de requêtes par secondes lors du test Le taux de transfert des données Taille de données transférées pendant le test

 

siege:

Nombre de transactions traitées Le taux de transaction par secondes  La taille de données transférées  Le ratio entre nombre de transaction et le temps. (le plus petit est le meilleur)

 


Laisser un commentaire

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