Vous venez d'être recruté par une startup qui commence à développer un jeu multijoueurs en ligne appelée "Pingouin zap".
Votre job est d'installer un serveur sur lequel tourneront plusieurs sites web:
On va faire ensemble ces différentes étapes.
Le serveur sera une machine virtuelle Debian.
Dans ce TP on va utiliser une machine virtuelle Debian.
Si vous avez encore celle qui a été crée au TP précédent, vous pouvez l'utiliser.
Sinon, suivez les indications suivantes:
La première étape est d'acheter "pingouin-zap.com".
Techniquement, comment s’appelle "pingouin-zap.com", "univ-paris13.fr", ou "google.fr" ...
Normalement, pour pouvoir utiliser le nom de domaine "pingouin-zap.com", il faudrait l'acheter chez un "registrar", comme Gandi, OVH ... ou bien d'autres.
Bien sur, on ne va pas acheter un domaine juste pour ce TP...
Quand vous utilisez un nom de domaine, votre système se connecte à un serveur DNS pour obtenir l'adresse IP correspondante.
Sur Linux, on peut court-circuiter ceci en ajoutant une ligne dans le fichier /etc/hosts
Sur votre machine hôte (pas sur la machine virtuelle) regardez la syntaxe de /etc/hosts
Quelle ligne faut-il ajouter à /etc/hosts ?
On peut ajouter plusieurs domaines sur une même ligne dans /etc/hosts:
172.20.0.100 pingouin-zap.com intranet.pingouin-zap.com
Vérifiez que "ping pingouin-zap.com" fonctionne bien.
Vérifiez que vous pouvez vous connecter avec ssh à pingouin-zap.com
Vérifiez aussi pour intranet.pingouin-zap.com
Essayez de vous connecter avec votre navigateur sur http://pingouin-zap.com
Normalement, ça ne devrait pas marcher.
Essayez de comprendre pourquoi.
Qu'est-ce qu'il manque sur votre machine virtuelle ?
Il manque le serveur web.
Quelle commande faut-il taper pour installer le serveur web ?
Vérifiez que la page web http://pingouin-zap.com/ affiche bien la page "Apache2 Debian Default Page".
En cas de difficulté demandez de l'aide à votre enseignant.
Pour le site principal pingouin-zap.com, on veut installer un CMS.
Un CMS est logiciel permettant de gérer un site web simplement.
Au TP-4, on a installé Wordpress, un CMS très utilisé.
Dans les pages suivantes, on va installer, ensemble, un autre CMS écrit en PHP appelé Joomla.
Les principes sont les mêmes.
Quels logiciels sont indispensables pour installer un logiciel comme Joomla ou Wordpress ?
Quelle commande faut-il taper pour installer la version 7.0 de PHP ?
Quelle commande faut-il taper pour installer le client MySQL ?
Quelle commande faut-il taper pour installer le serveur MySQL ?
Pour ajouter au PHP les fonctions permettant d’accéder à MySQL et à XML il faut installer des extensions du php: les paquets php-mysql et php-xml:
sudo apt install php-mysql php-xml
puis redémarrer le serveur web.
Quelle commande faut-il taper pour redémarrer le serveur web ?
Les logiciels comme Wordpress ou Joomla enregistrent leurs informations dans une base de données.
Le serveur de base de données MySQL, permet de créer plusieurs bases de données ainsi que des utilisateurs ayant certains des droits sur ces base de données.
On doit donc créer une base de données dans MySQL. Pour ça, il faut se connecter au serveur MySQL avec
sudo mysql -u root
En regardant votre cours, quelle commande SQL faut-il taper pour créer une base de données appelée bdd_joomla ?
Quelle commande SQL faut-il taper pour
Tout ceci se fait en une seule commande SQL, vue en cours et au TP4.
Téléchargez Joomla depuis https://www.joomla.fr
Le fichier est téléchargé sur la machine hôte.
Quelle commande taper pour le copier sur la machine virtuelle ?
Dans quel répertoire se trouve le site web affiché par http://pingouin-zap.com ?
Quel utilisateur est propriétaire du répertoire /var/www/html ?
On voudrait installer le site sans être root.
Quelle commande taper pour que le propriétaire de /var/www/html soit vous ? (utilisateur "joe" sur la machine virtuelle fournie)
Pour désarchiver un fichier .zip il faut installer unzip:
sudo apt install unzip
Ensuite, allez dans /var/www/html et supprimez la page "Apache2 Debian Default Page".
rm index.html
puis et tapez la commande:
unzip (chemin)/Joomla_...zip
en remplacant "(chemin)/Joomla_...zip" par le chemin complet du fichier .zip que vous avez copié.
Ça y est! Tout est prêt pour installer Joomla :-)
Rentrez http://pingouin-zap.com dans votre navigateur.
Vous devriez voir l'installateur de Joomla.
Suivez toutes les différentes étapes. Vous n'avez pas à configurer l'étape ftp.
A la fin, Joomla vous demande de
Faites-le.
Dans cette partie on va installer ensemble plusieurs sites web sur notre machine virtuelle.
Si vous reprenez ce TP et n'avez pas la machine virtuelle ou si vous avez rencontré des difficultés dans la partie précédente, vous pouvez utiliser la machine virtuelle "correction":
https://moodle.iutv.univ-paris13.fr/img/sa/pingouin-apres-joomla.ova
(instructions plus détaillées sur l'utilisation de cette machine virtuelle, ici, au début du TP)
Il existe des sites web de toutes les tailles. Les sites web très fréquentés (Google, Facebook...) ont besoin de centaines de milliers de machines.
A l'inverse, une seule machine peut facilement héberger un grand nombre de petits sites web.
C'est qu'on appelle l’hébergement mutualisé.
Le serveur web (apache) distingue chaque site en fonction de son nom de domaine (dans l'URL). Chaque site a alors son propre fichier de configuration Apache « VirtualHost ». La directive DocumentRoot permet de donner à chaque site un répertoire différent pour ses fichiers.
On crée généralement une base de données différente pour chaque site.
Dans les pages suivantes, on va configurer ensemble un système de ce type.
Dans que répertoire se trouvent les fichiers de configuration du serveur web ?
Le répertoire /etc/apache2 contient de nombreux fichiers et sous-répertoires.
Prenez un moment pour regarder naviguer dans dedans en essayant de comprendre la structure.
Remarquez que les fichiers affichés en bleu clair par ls sont en réalité des liens symboliques.
Utilisez "ls -la" pour voir où pointent ces liens.
Pourquoi cette structure compliquée ?
On pourrait tout mettre dans le fichier apache2.conf, mais il deviendrait trop grand et ce serait difficile à maintenir.
Le contenu d'apache2.conf est donc reparti sur plusieurs fichiers. Dans le fichier apache2.conf il y a des lignes comme "IncludeOptional sites-enabled/*.conf", qui incluent les fichiers contenus dans les répertoires "...-enabled".
L'utilisation des liens symboliques permet de simplement créer / supprimer un lien symbolique pour activer / désactiver un composant (site web, module, configuration).
Par exemple, ici, il n'y a pas de lien symbolique de sites-enabled vers sites-available pour default-ssl.conf. Le site web default-ssl.conf est donc désactivé. Pour l'activer, il suffirait de créer le lien symbolique. On peut le faire à la main ou utiliser des commandes (a2ensite/a2dissite).
On va maintenant créer le site web intranet.pingouin-zap.com
Commençons par le fichier de configuration Apache VirtualHost"
On a bien crée /etc/apache2/sites-available/intranet.conf
Il faut maintenant créer le lien symbolique dans /etc/apache2/sites-enabled
Faites le à la main, ou bien tapez la commande "sudo a2ensite intranet.conf"
Dans le deux cas, vérifiez avec "ls -l /etc/apache2/sites-enabled" est bien crée.
On vient de modifier des fichiers de configuration d'Apache.
Quelle commande faut-il taper pour que ces changements soient pris en compte ?
On a dit à Apache de chercher les fichiers de intranet.pingouin-zap.com dans /var/www/intranet
Quelle commande taper pour créer ce répertoire ?
(essayez avant de répondre)
Ca y'est, on a fini!
Créez un fichier test.html dans /var/www/intranet
Vérifiez que vous le voyez ici: http://intranet.pingouin-zap.com/
Vérifiez que ce site est bien différent de http://pingouin-zap.com/
Dans les pages suivantes, on va installer ensemble un firewall (pare-feu).
Le firewall est un outil de sécurité, permettant, entre-autres, de limiter les connexions sur votre serveur à certains ports.
On va installer un firewall très simple appelé "ufw"
Quelle commande faut-il taper pour l'installer ?
Tapez la commande
sudo ufw status
Par défaut le firewall n'est pas activé.
Sur la machine hôte, tapez
nmap pingouin-zap.com
Quels services sont visibles sur pingouin-zap.com ?
Avant d'activer le firewall, il fait lui dire de laisser passez les connexions ssh, sinon on ne pourrait plus se connecter !
(en pratique il faut faire très attention à ce genre de problème !)
sudo ufw allow 22
Maintenant activez le firewall:
sudo ufw enable
Vérifiez que le firewall fonctionne. Sur la machine hôte:
nmap -Pn pingouin-zap.com
Essayez de vous connecter sur http://pingouin-zap.com
Regardez les tentatives de connexion bloquées avec
tail -f /var/log/ufw.log
en même temps que vous rechargez la page http://pingouin-zap.com
En vous inspirant de ce qui a été fait, quelle commande taper pour permettre les connexions sur le serveur web ?
Vérifiez que vous pouvez vous connecter sur http://pingouin-zap.com
Utilisez
sudo ufw status
pour vérifiez l’état de votre firewall
Vous remarquez que ufw crée deux règles pour chaque port: l'une pour ipv4 et l'autre pour ipv6.
Pour effacer une règle du firewall on peut utiliser la commande
sudo ufw delete numéro
où "numéro" est le numéro de la règle.
Pour voir la liste de règles avec leurs numéros:
sudo ufw status numbered
Quelle commande taper pour effacer la règle qui permet les connexions au site web (version IPV4) ?
Essayez avant de répondre.
Vérifiez que la connexion à http://pingouin-zap.com est bien bloquée.
Rouvrez le port 80 et vérifier que http://pingouin-zap.com fonctionne à nouveau.Quand on administre un serveur web, il est important de faire des sauvegardes des bases de données.
C'est utile, par exemple, si la machine venait à tomber en panne, mais aussi pour pouvoir revenir en arrière lorsque l'on fait de modifications dans un logiciel web, comme Joomla, Wordpress...
Dans les pages suivantes on va voir comment ça se fait.
Rappel du cours:
La commande mysqldump permet de créer une sauvegarde d'une base de données.
La syntaxe est la suivante:
mysqldump -u utilisateur-de-la-bdd -p nom-de-la-bddd > fichier-de-sauvegarde
Si vous avez suivi les consignes :
L'utilisateur est: user_bdd_joomla
Le nom de la base de données est: bdd_joomla
Si vous utilisez la machine virtuelle corrigée le mot de passe est "abc"
Essayez
Regardez le contenu du fichier de sauvegarde.
A quoi ressemble-t-il ?
Des données au format JSON
Des données au format XML
Le fichier de sauvegarde est en fait une série d'instructions SQL.
Si vous regardez bien, vous trouverez les instructions "CREATE TABLE ..." et "INSERT INTO" qui permettent de re-créer la base de données telle qu'elle était au moment de la sauvegarde.
On va vérifier ça.
D'abord faisons quelques changements sur votre site.
Connectez vous sur http://pingouin-zap.com (sur le corrigé: login: "admin", mdp: "abcd").
Faîtes des modifications visibles sur la page. Par exemple, modifiez l'article de la page d'accueil.
Ensuite restaurez la sauvegarde de la base de données avec:
mysql -u utilisateur-de-la-bdd -p nom-de-la-bddd < fichier-de-sauvegardeCette commande est très simple. Elle ne fait qu’exécuter tous les commandes SQL contenues dans le fichier de sauvegarde.
Regardez http://pingouin-zap.com
Normalement, il devrait être revenu à l'état où il était lors de la sauvegarde (donc avant ces modifications).
On voudrait sauvegarder la base de données de la machine virtuelle à partir de la machine hôte.
On va utiliser ssh, qui permet d’exécuter une commande à distance (ce sera mysqldump).
On veut exécuter mysqldump en tant que root pour éviter le mot de passe MySQL.
Il faut donc d'abord configurer le serveur ssh de la machine virtuelle pour qu'il accepte les connexions en tant que root.
Quel est le chemin complet du fichier de configuration du serveur ssh ?
(n'hésitez pas à chercher sur votre machine)
Dans /etc/ssh/sshd_config ajoutez la ligne
PermitRootLogin yes
On vient de modifier ce fichier de configuration. Quel réflexe faut-il avoir, juste après ?
Quelle commande taper ?
Vérifiez que vous pouvez vous connecter sur la machine virtuelle par ssh en tant que root.
(si vous utiliser la machine corrigée, le mot de passe root est "root123")
Exécutons maintenant la sauvegarde mysqldump à distance.
"ssh" permet d'executer une commande à distance, comme ceci:
ssh utilisateur@exemple.org commande argument argument ...
Donc:
ssh root@pingouin-zap.com mysqldump bdd_joomla
La sauvegarde s'affiche à l'écran!
Redirigez dans un fichier:
ssh root@pingouin-zap.com mysqldump bdd_joomla > fichier-sauvegarde
Pour faire la sauvegarde, on a eu besoin de taper le mot de passe root.
Cette approche ne convient donc pas pour une sauvegarde automatique (par exemple, toutes les nuits).
On a vu en cours, qu'il était possible d'utiliser ssh sans mot de passe.
Rappel:
Pour mettre en place un ssh sans mot de passe de hôte vers pingouin-zap.com, quelles affirmations sont vraies ?
la clé privée de pingouin-zap.com doit être mise sur hôte dans /root/.ssh/authorized_keys
La démarche est la suivante.
Commençons par 1.
Sur le hôte, allez dans ~/.ssh et créez les clés avec, en rentrant "entrée" (mot de passe vide) :
ssh-keygen -f sauvegarde-sql -C sauvegarde-sql
vérifiez que vous avez bien les deux fichiers:
ssh -i ~/.ssh/sauvegarde-sql root@pingouin-zap.com
Ce que l'on vient de faire fonctionne, mais est risqué. Si quelqu'un réussi à lire le fichier contenant la clé privée (qui n'est pas protégée par un mot de passe), il peut se connecter par ssh en tant que root !
On peut restreindre à une seule commande (mysqldump) et à une seule adresse IP (la machine hôte).
Il faut remplacer la ligne dans authorized_keys par:
command="/usr/bin/mysqldump bdd_joomla",from="172.20.0.1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ...
(remplacer "ssh-rsa ..." par la clé publique)
Dans les pages suivantes, on va sauvegarder la machine entière, en utilisant rsync.
rsync est une commande qui permet, comme scp, de copier des fichiers d'une machine à une autre.
rsync est particulièrement bien conçu pour copier une grande arborescence de fichiers.
Si une copie a déjà été faite, rsync permet à la nouvelle copie de ne copier que les fichiers ayant changé depuis la copie précédente.
Avec rsync, on peut copier tous les fichiers d'une machine, et donc d'en faire une sauvegarde complète.
Que faudrait-il taper pour copier, avec scp, le répertoire racine de pingouin-zap.com vers le répertoire de /var/local/sauvegarde de la machine hôte.
La commande est exécutée sur la machine hôte en tant que root.
Le compte utilisé sur pingouin-zap.com est root aussi.
(pour copier des répertoires, il faut utiliser l'option "-r" )
(ne l'essayez pas sur votre machine)
Maintenant on va faire la copie avec rsync:
Vérifiez que rsync est bien installé à la fois sur le hôte et la machine virtuelle (installez sinon).
D'abord, il faut créer le répertoire:
sudo mkdir /var/local/sauvegarde/
Puis faire la copie:
sudo rsync -axv --numeric-ids --delete pingouin-zap.com:/ /var/local/sauvegarde/
La copie peut prendre plusieurs minutes.
Quelques explications sur les options:
Vérifiez que les fichiers ont bien été copiés dans /var/local/sauvegarde/
Recommencez exactement la même commande rsync.
Vous verrez que cette fois, c'est très rapide.
Seuls les fichiers modifiés sont copiés. Il s'agit souvent de fichiers logs.
Essayez de modifier un fichier sur pingouin-zap.com et refaites un rsync.
Vérifiez que ce fichier est bien recopié.
Voici la machine corrigée:
https://moodle.iutv.univ-paris13.fr/img/sa/pingouin-corrige-fin-tp7.ova