Objectifs
Savoir configurer nginx pour héberger plusieurs sites web sur le même serveur
Savoir analyser les logs de nginx
Multi-site
Définition : Multi-site
Le multi-site permet d'héberger plusieurs sites internet sur le même serveur, c'est à dire la même ip.
Nom de domaine
Dans le cadre de cette Api, vous avez accès aux sous-domaines <monsite>.picagraine.net. Vous pouvez créer trois sous-sous-domaines de la forme
<site1>.<monsite>.picagraine.net
<site2>.<monsite>.picagraine.net
<site3>.<monsite>.picagraine.net
Complément : Modification du fichier Hosts
Si on ne possédait pas de nom de domaine, on pourrait tricher en modifiant le fichier hosts de notre machine afin que plusieurs nom de domaines artificiels pointent vers la même ip.
Attention : Ces modifications sont à faire sur le client et non sur le serveur.
Rendez vous dans le répertoire
/etc
Utilisez un éditeur afin de modifier le fichier
/etc/hosts
avec les droitssudo
Ajoutez comme ci-dessous deux sites pointant sur l'ip de votre serveur
Vous pouvez ensuite taper les adresses monsite1.fr et monsite2.fr dans un navigateur et vérifier qu'elles pointent bien sur votre site.
Vous pouvez aussi utiliser la commande ping
pour vérifier que les adresses pointent bien sur votre serveur.
ping monsite1.fr
Et le serveur nous renvoie bien les paquets :
PING monsite1.fr (192.168.1.9) 56(84) bytes of data.
64 bytes from monsite1.fr (192.168.1.9): icmp_seq=1 ttl=64 time=0.569 ms
64 bytes from monsite1.fr (192.168.1.9): icmp_seq=2 ttl=64 time=0.801 ms
64 bytes from monsite1.fr (192.168.1.9): icmp_seq=3 ttl=64 time=0.750 ms
Pour arrêter le processus ping, il vous suffit d'appuyer sur Ctrl+C.
Modification de la configuration
Nous allons devoir modifier la configuration car nous ne voulons pas que nos 2 adresses pointent sur le même site.
server {
listen 80;
server_name monsite1.fr; #adresse 1
location / {
root /var/www/monsite1.fr; #racine du site internet 1
index index.html;
}
}
server {
listen 80;
server_name monsite2.fr; #adresse 2
location / {
root /var/www/monsite2.fr; #racine du site 2
index index.html;
}
}
Il faut au préalable avoir créé 2 sites en html
dans les dossiers que vous avez indiqué dans la configuration. Un site très simple suffira :
<html><h1> Site 1 </h1></html>
Exercice
Exercice d'application
Dans cet exercice nous viserons l'installation d'un serveur multi-site sur un VPS sans interface graphique dans le but d'y accéder à partir de n'importe quel appareil disposant d'un navigateur web.
Préparation des sites internet
Depuis votre machine cliente créer 3 dossiers contenant chacun un site internet en html.
Connectez vous en SSH à votre serveur puis à l'aide de la commande SCP placez vos site sur le serveur.
Vous pouvez vous référer au cours sur le SSH.
Quel est l'avantage de travailler sur sa machine et d'utiliser SSH pour accéder au serveur ?
De façon générale il est beaucoup plus agréable de travailler sur sa propre machine possédant une interface graphique plutôt que de travailler directement sur la console du serveur.
Configuration de nginx
Reprendre le cours pour installer nginx sur la machine serveur si ce n'est pas déjà fait.
Créer une configuration nginx afin de pouvoir accéder aux 3 sites différents en tapant les urls suivantes :
<site1>.<monsite>.picagraine.net
<site2>.<monsite>.picagraine.net
<site3>.<monsite>.picagraine.net
Comment faire en sorte que le serveur écoute sur le port 81 et comment accéder à nos pages ?
Il suffit de modifier le port écouté dans la configuration.
Pour accéder à vos page il suffit d'ajouter le numéro de port à la fin de l'adresse du serveur :
<site1>.<monsite>.picagraine.net:81
Utilisez la documentation officielle nginx pour trouver comment avoir accès aux logs de connexion aux serveur.
Ajoutez à votre configuration la ligne suivante :
access_log /cheminDesLogs; #commande générale
access_log /home/logs/nginx-access.log; #exemple de syntaxe
Solution générale de la configuration
server {
listen 81;
server_name <site1>.<monsite>.picagraine.net;
location / {
root /home/www/site1;
index index.html;
}
access_log /home/logs/site1.log;
}
server {
listen 81;
server_name <site2>.<monsite>.picagraine.net;
location / {
root /home/www/site2;
index index.html;
}
access_log /home/logs/site2.log;
}
server {
listen 81;
server_name <site3>.<monsite>.picagraine.net;
location / {
root /home/www/site3;
index index.html;
}
access_log /home/logs/site3.log;
}
Complément : Consultation des logs
Il peut être utile de vouloir consulter les logs afin de détecter les problèmes ou anomalies de connexion par exemple. Pour cela on peut utiliser la commande tail
qui permet d'afficher les 10 dernières lignes d'un fichier.
tail /home/logs/site1.log
Analyse des logs
Voici un extrait des logs de connexion à un serveur nginx :
192.168.1.36 - - [26/Nov/2017:15:06:47 +0100] "GET /home.php HTTP/1.1" 200 45 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.1.36 - - [26/Nov/2017:15:25:47 +0100] "GET /home.php HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [28/Nov/2017:14:21:23 +0100] "GET / HTTP/1.1" 200 17 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [28/Nov/2017:14:21:23 +0100] "GET /favicon.ico HTTP/1.1" 404 143 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [28/Nov/2017:14:21:23 +0100] "GET /favicon.ico HTTP/1.1" 404 143 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [28/Nov/2017:14:22:17 +0100] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [28/Nov/2017:14:22:17 +0100] "GET /favicon.ico HTTP/1.1" 404 143 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [28/Nov/2017:14:22:17 +0100] "GET /favicon.ico HTTP/1.1" 404 143 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [01/Dec/2017:12:02:41 +0100] "GET / HTTP/1.1" 200 17 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
192.168.43.222 - - [01/Dec/2017:12:02:41 +0100] "GET /favicon.ico HTTP/1.1" 404 143 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
Extrait de /var/log/nginx/error.log :
2017/11/26 14:11:34 [emerg] 882#882: open() "/home/logs/nginx-access.log" failed (2: No such file or directory)
2 clients différents se sont connectés au serveur.
Les clients utilisaient des navigateurs différents.
Un client a essayé d'accéder au fichier home.php
.
Nginx a essayé d'ouvrir le fichier nginx-access.log mais ne l'a pas trouvé.
Nginx ne trouve pas le fichier favicon.ico
2 clients différents se sont connectés au serveur.
Les clients utilisaient des navigateurs différents.
Un client a essayé d'accéder au fichier home.php
.
Nginx a essayé d'ouvrir le fichier nginx-access.log mais ne l'a pas trouvé.
Nginx ne trouve pas le fichier favicon.ico
2 clients différents se sont connectés au serveur.
On voit 2 ip différentes : 192.168.1.36 et 192.168.43.222
Les clients utilisaient des navigateurs différents.
On voit que toutes les connections ont été effectuées depuis un navigateur Firefox en version 57.0 .
Un client a essayé d'accéder au fichier home.php
.
Ligne 1 on peut voir GET /home.php
ce qui signifier que ce client à essayé d'accéder à ce fichier.
Nginx a essayé d'ouvrir le fichier nginx-access.log mais ne l'a pas trouvé.
Le fichier n'était pas encore créé lors du test de la configuration nginx a donc rencontré une erreur.
Nginx ne trouve pas le fichier favicon.ico
Le fichier favicon.ico est un fichier qui se charge par défaut lors de la consultation d'une page web. On voit ligne 4 qu'on récupère une erreur 404 sur le "GET /favicon.ico HTTP/1.1"
Il peut être utile lorsque nous ne comprenons pas un problème de s'intéresser aux logs qui contiennent beaucoup d'informations sur les connexions ainsi que les erreurs.
Analyse des logs 2
Après avoir tenté la commande sudo systemctl start nginx le terminal nous renvoie une erreur.
Voici un extrait de la commande journalctl -xe
que le terminal nous propose d'entrer suite à l'erreur :
-- L'unité (unit) nginx.service a commencé à démarrer.
déc. 06 14:55:24 alice nginx[816]: nginx: [emerg] unexpected end of file, expecting ";" or "}" in /etc/nginx/sites-enabled/testLogs:10
déc. 06 14:55:24 alice nginx[816]: nginx: configuration file /etc/nginx/nginx.conf test failed
déc. 06 14:55:24 alice systemd[1]: nginx.service: Control process exited, code=exited status=1
déc. 06 14:55:24 alice systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: L'unité (unit) nginx.service a échoué
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- L'unité (unit) nginx.service a échoué, avec le résultat failed.
déc. 06 14:55:24 alice systemd[1]: nginx.service: Unit entered failed state.
déc. 06 14:55:24 alice systemd[1]: nginx.service: Failed with result 'exit-code'.
déc. 06 14:55:24 alice sudo[813]: pam_unix(sudo:session): session closed for user root
déc. 06 14:55:40 alice sudo[820]: dev : TTY=pts/0 ; PWD=/home/dev ; USER=root ; COMMAND=/bin/journalctl -xe
déc. 06 14:55:40 alice sudo[820]: pam_unix(sudo:session): session opened for user root by dev(uid=0)
Il y a un problème dans le fichier de configuration du serveur
Le serveur nginx a réussi à démarrer correctement.
Certains lignes n'ont aucun rapport avec nginx
Il y a un problème dans le fichier de configuration du serveur
Le serveur nginx a réussi à démarrer correctement.
Certains lignes n'ont aucun rapport avec nginx
Il y a un problème dans le fichier de configuration du serveur
À la deuxième ligne du résultat de la commande journalctl -xe
on peut voir qu'il y a un problème de syntaxe dans le fichier /etc/nginx/sites-enabled/testLogs
Le serveur nginx a réussi à démarrer correctement.
Certains lignes n'ont aucun rapport avec nginx
Les 2 dernières lignes sont les logs de l'execution de la commande journalctl -xe