Serveur dédié

Tutoriel : Comment monter une architecture web LAMP hautement disponible avec répartition de charge sur DEBIAN 9.

 

Nous avons donc une architecture informatique composée de deux serveurs web frontaux appelés ci-dessous web1 et web2, un serveur mysql appelé mysql et un serveur de fichiers appelé filer.

 

La première chose a faire et de mettre à jour votre systeme su chaque serveur composant votre cluster.

 

$ sudo apt-get update

$ sudo apt-get upgrade

 

 

Maintenant cela fait il faut nommer vos serveurs et de faire pointer vos DNS sur leurs petits noms.

 

web1 IN A ip-serveur-web1

web2 IN A ip serveur-web2

mysql IN A ip-serveur-mysql

filer IN A ip-serveur-de-fichiers

 

Nous allons mettre à jour le nom des serveurs en modifiant le fichier hostname de chacun des serveurs nommés ci-dessus

 

$ sudo nano /etc/hostname

 

web1 vous le nommez web1.mon-domaine.tld

web2 vous le nommez web2.mon-domaine.tld

mysql vous le nommez mysql.mon-domaine.tld

filer vous le nommez filer.mon-domaine.tld

 

Pour que les hostname soient pris en compte il faut rebooter les serveurs.

 

Maintenant vous modifiez vos fichier hosts afin que les nom de serveurs soient bien pris en compte en attendant la résolution de vos nouveaux DNS. Vous faites la modification sur chacun de vos serveurs.

 

$ sudo nano /etc/hosts

 

ip-serveur-web1  web1  web1.mon-domaine.tld

ip-serveur-web2  web2  web2.mon-domaine.tld

ip-serveur-mysql  mysql  mysql.mon-domaine.tld

ip-serveur-de-fichiers  filer  filer.mon-domaine.tld

 

On installe apache2 sur les web1 et web2 frontaux :

 

$sudo apt-get install apache2

 

On installe sur web1 et web2 php7,x

 

$ sudo apt-get install php

 

On configure une page phpinfo.php sur web1 et web2 afin de voir si tout est en place

 

$ sudo nano /var/www/html/phpinfo.php

 

On colle ce bout de code dans la page que vous venez d’ouvrir (phpinfo.php)

 

<?php
phpinfo();
?>

pour enregistrer vous faite ctrl+o puis entrer puis ctrl+x puis entrer

 

Voilà votre fichier phpinfo.php est enregistré à la racine de votre serveur web. Nous allons maintenant nous rendre sur la page phpinfo.php voir si PHP et apache fonctionne bien,

 

Ouvrez avec votre explorer internet préféré l’url de votre serveur web1 et idem pour web2

 

http://ip-de-votre-serveur-web1/phpinfo.php

 

et sur le serveur web2

 

http://ip-de-votre-serveur-web2/phpinfo.php

 

Vous devriez voir une page PHP avec les infos de votre serveur web et php.

 

Maintenant vous allons installer serveur mysql sur l’host mysql.mon-domaine.tld

 

$ sudo apt-get update

$  sudo apt-get upgrade

$ sudo apt-get install mysql-server

 

Voilà mysql est installé. Maintenant sur Debian 9 il installe mariadb, c’est un peu différent de mysql-server.

 Sur votre serveur mysql vous vous connectez à mariadb

 

$ sudo mysql -u root -p

 

il vous demande votre password. Tapez entrer et vous devriez avoir l’invite de commande de mariadb qui apparaît.

 

Par la suite quand vous créerez une base de donnée il faudra donner accès à mysql a tous les hosts de votre cluster car sans cette opération vous ne pourrez pas connecter vos web1 et web2 à votre serveur mysql.

 

Nous allons donner acces distant à votre serveur mysql :

 

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

 

 

Ensuite, faites le changement ci-dessous :

bind-address = 127.0.0.1

à

bind-address = 0.0.0.0

 

Pour vérifier que vos changements, exécutez les commandes ci-dessous

 

$ sudo netstat -anp | grep 3306

 

Vous devriez trouver un résultat qui ressemble à celui ci-dessous

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1763/mysqld

 

Configurer une IP pour se connecter à une base de données.

Maintenant, le serveur est configuré pour écouter toutes les adresses IP mais les adresses IP des serverus composant votre cluster web haute disponibilité doivent être explicitement configurées pour se connecter à une base de données.

Pour permettre à vos serveurs de se connecter à une base de données, vous devez autoriser l’accès au serveur distant.

Par exemple, si vous souhaitez que vos serveurs client avec leurs adresses IP se connecte à une base de données appelée wordpress en tant qu’utilisateur wpuser, exécutez les commandes ci-dessous après vous être connecté au serveur de base de données,

$ sudo mysql -u root -p

 

Modifiez le nom de la base de données (wordpress) et l'user (wpuser) de celle-ci par ceux que vous souhaitez : 

 

create database wordpress;

create user wpuser;

set password for wpuser= PASSWORD(“motdepasse“);

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@ip-de-votre-serveur-web1 IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@ip-de-votre-serveur-web2 IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@ip-de-votre-serveur-filer IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@web1 IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@web2 IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@web1.domain.tld IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@web2.domain.tld IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@filer IDENTIFIED by “motdepasse”;

GRANT ALL PRIVILEGES ON wordpress.* TO wpuser@filer.domain.tld IDENTIFIED by “motdepasse”;

exit

 

Installez sur web1, web2 et filer  mariadb-client

sudo apt-get install mariadb-client

 

Pour test essayez maintenant de vous connecter à votre serveur mysql depuis chaque serveur composant votre cluster web haute disponibilité (web1, web2 et filer). Noubliez pas de changer wpuser par l'user que vous avez indiqué lors de la creation de vos bases de données (voir ci dessus les requetes mysql).

 

$ sudo mysql -h ip-de-votre-serveur-mysql -u wpuser -p

 

le prompt va vous demander le mot de passe que vous avez indiqué lors de la création de la base de données wordpress ou autre bese de données, selon celle que vous avez indiquez dans vos requêtes mysql (voir ci-dessus),

 

Tapez votre mot de passe et là si vous arrivez à vous connecter au serveur mysql depuis les serveurs composant votre cluster web alors c’est gagné. Autrement recommencez l’opération décrite ci-dessus avec les commandes mysql.

 

Si vous avez un Firewall il faut autorisé les connexion tcp sur le port mysql 3306.

 

Maintenant nous allons configurer le serveur de fichiers NFS :

 

Connectez vous sur le filer.domain.tld

 

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install nfs-kernel-server

 

Nous allons ajouter l’utilisateur sites à vos utilisateurs system

 

$ sudo adduser sites

mot de passe : entrez le mot de passe choisi

répondez si vous le désirez au 3 ou 4 questions qui suivent (facultatif)

 

Maintenant nous allons nous occuper de la configuration d'un 'export NFS' qui se fait en éditant le ficher /etc/exports

 

$ sudo nano /etc/exports

 

Vous ajouter ces lignes dans le fichier exports

 

/home/sites/    ip-de-votre-serveur-web1/32(rw,all_squash,anonuid=1001,anongid=1001,sync)  ip-de-votre-serveur-web2/32(rw,all_squash,anonuid=1001,anongid=1001,sync)


ATTENTION : le numéro de anonuid et anongid doit correspondre à votre user sites. Pour vérifier le uid et le gid de l’user sites allez éditer les fichiers /etc/passwd et /etc/group

 

Avant de monter le serveur NFS nous allons créer des répertoires dans le dossier /home/sites

Pour cela connectez vous à l’user sites

 

$ su sites

 

$ mkdir /home/sites/vhosts

$ mkdir /home/sites/sessions

 

Après avoir défini vos partages dans le fichier /etc/exports il suffit de relancer le service NFS:

$ sudo service nfs-kernel-server reload

Cette commande ne coupe pas les transferts en cours si la nouvelle configuration permet toujours leur accès au serveur. Vous pouvez donc la lancer plus ou moins à n'importe quel moment.

Pour vérifier que l'export a bien eu lieu, taper sur le serveur la commande :

$ showmount -e

Si l'export n'est pas effectif , il faut faire restart du service mais attention cela peut interrompre les transferts en cours :

$  sudo service nfs-kernel-server restart

Un peu de sécurité avec TCPwrapper

Pas indispensable si vous avez un bon Firewall entre internet et votre réseau local, peut être protégé par le serveur le cas échéant. (testez tout d'abord votre configuration sans protection pour voir si tout fonctionne si vous comptez utiliser ce genre de protection dans le futur)

Si vous utilisez denyhosts sur le serveur, il vous faudra ajouter les lignes suivantes dans le fichier /etc/hosts.allow :

 

$ sudo nano /etc/hosts.allow
portmap: ip de la machine web1/ip de la machine web2
lockd: ip de la machine web1/ip de la machine web2
nfsd: ip de la machine web1/ip de la machine web2
mountd: ip de la machine web1/ip de la machine web2
rquotad: ip de la machine web1/ip de la machine web2
statd: ip de la machine web1/ip de la machine web2

et également afin de sécuriser un peu plus votre installation, ajouter dans le fichier /etc/hosts.deny :

 

$ sudo nano /etc/hosts.deny
# Tout interdire sur  portmap, nfsd et mountd
portmap:ALL
nfsd:ALL
mountd:ALL

 

 

Connectez vous maintenant à vos serveur web1 et web2

 

$ sudo adduser sites

password :

 

 

Nous allons maintenant installer le client NFS sur web1 et web2 :

 

$ sudo apt-get install nfs-common

 

Créez le dossier sites dans /mnt/

 

$ sudo mkdir /mnt/sites

 

 

Il faut maintenant modifier sur web1 et web2 le fichier /etc/fstab pour y ajouter la ligne:

 

$ sudo nano /etc/fstab

 

Ajouter la ligne suivante à la fin du fichier

 

ip-de-votre-filer:/home/sites/ /mnt/sites nfs rw,auto 0 0

 

 

Voilà maintenant vous pouvez monter sur web1 et web2 la partition de votre serveur NFS

 

$  sudo mount -t nfs -o rw ip-de-votre-filer:/home/sites /mnt/sites

 

Normalement vous devriez maintenant votre les dossiers vhosts/ sessions/ et logs/ dans le répertoire /mnt/sites/ des serveurs web1 et web2

 

$ sudo ls -l /mnt/sites

 

Si vous voyez les répertoires désignés ci dessus sur web1 et web2 c’est que votre partage NFS fonctionne.

 

Vérifiez maintenant que l’user sites et le même uid et gid sur web1 et web2 que sur le filer.

Si c’est pas le cas vous modifier le chiffre de web1 et web2 dans /etc/passwd et /etc/group.

 

Il faut que le uid et le gid de web1 et web2 soit le même que sur le filer.

 

 

A ce stade je vous conseille de rebooter vos serveurs pour voir si le montage NFS se fait bien au demarrage des machines.

 

 

Configuration d’apache pour qu’il prenne les vhosts dans /mnt/sites/vhosts :

 

Sur web1 et web2

 

$ sudo nano /etc/apache2/apache2.conf

 

a la fin du fichier vous commentez le ligne suivante:

 

#IncludeOptional sites-enabled/*.conf

 

et vous ajouter la ligne suivante :

 

IncludeOptional /mnt/sites/vhosts/*.conf

 

Ceci signifie que vos vhosts devront-être créés dans /mnt/sites/vhosts pour qu’ils fonctionnent.

 

Copier les vhosts de /etc/apache2/sites-available/* dans mnt/sites/vhosts/*

 

$ sudo cp -R /etc/apache2/sites-available/* /mnt/sites/vhosts

 

 

Nous allons maintenant configurer le répertoire de sessions de php sur web1 et web2:

 

 

$ sudo nano /etc/php/7.x/apache2/php.ini

 

 Chercher le ligne "session.save_path =" en faisant ctrl+w et en collant session.save_path = (puis tapez entrer)

 

et vous renseignez comme ceci :

 

session.save_path = "/mnt/sites/sessions"

 

 

Rebootez apache sur web1 et web2 :

 

$ sudo /etc/init.d/apache2 restart

 

Il ne vous reste plus qu’a mettre un acces FTP sur Web1 et Web2 :

 

$ sudo apt-get install proftpd

 

 

$ sudo nano /etc/proftpd/proftpd.conf

 

#Il faut dé-commenté cette ligne // Pour bloquer l'utilisateur dans son répertoire

DefaultRoot ~

 

#Modification du port par défaut

port 21

 

#Il faut dé-commenté cette ligne // Pour active le passive port

PassivPorts XXXX XXXX

 

# Ajout à la fin du fichier // Pour gérer les utilisateurs

AuthUserFile /etc/ftpd.passwd

 

 

$ sudo nano /etc/shells

 

# Ajout à la fin //

/bin/false

 

Ajout d’un utilisateur

Nous allons ajouter notre premier utilisateur ftp. Pour cela, on se rend dans /etc pour créer le fichier que nous avons déclarer.

Je vais décomposer les toutes les options de la commande,  (–name= nom de l’utilisateur) (–uid= & –gid= ID de l’utilisateur et du groupe) (–home= Répertoire d’accès) (–shell= Sont shell bidon)

 

ftpasswd --passwd --name=sites --uid=1001 --gid=1001 --home=/mnt/sites --shell=/bin/false –file=/etc/ftpd.passwd

 

Dans l’exemple ci-dessus, pour l’utilisateur sites j’ai choisi en uid et gid (1001) mettez celui que vous avez configuré sur filer, web1 et web2.

 

Vous devriez pouvoir vous connecter par ftp à votre répertoire /mnt/sites

 

A vous de créer un repertoire « nom-domaine.tld » pour vos sites et un dossier public_html afin de faire pointer vos vhosts apache dedant.

 

Répartition de charge :

 

Vous pouvez configurer la répartition de charge par Round-Robin DNS ou via une offre de load-balancing chez OVH (attention il faut que vous aillez des serveurs OVH pour que celà fonctionne).

 

Pour le Round-Robin DNS il faut configurer votre domaine racine sur les 2 ip de vos serveur web1 et web2.

 

mon-domaine.tld. IN A mon-ip-web1

mon.domaine.tld. IN A mon-ip-web2

 

Pour votre ftp

 

ftp IN CNAME mon-domaine.tld.

 

Voila vous avez une architecture informatique hautement disponible a par pour le serveur mysql.