Nginx avancé

Objectifs

Savoir configurer nginx pour héberger plusieurs sites web sur le même serveur

Savoir analyser les logs de nginx

Multi-site

DéfinitionMulti-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émentModification 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.

  1. Rendez vous dans le répertoire /etc

  2. Utilisez un éditeur afin de modifier le fichier /etc/hosts avec les droits sudo

  3. Ajoutez comme ci-dessous deux sites pointant sur l'ip de votre serveur

  4. Vous pouvez ensuite taper les adresses monsite1.fr et monsite2.fr dans un navigateur et vérifier qu'elles pointent bien sur votre site.

Modifications fichier Hosts

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>
Multi-site

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émentConsultation 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

Liste des raccourcis clavier

Liste des fonctions de navigation et leurs raccourcis clavier correspondant :

  • Bloc Suivant : flèche droite, flèche bas, barre espace, page suivante, touche N
  • Bloc Précédent : flèche gauche, flèche haut, retour arrière, page précédente, touche P
  • Diapositive Suivante : touche T
  • Diapositive Précédente : touche S
  • Retour accueil : touche Début
  • Menu : touche M
  • Revenir à l'accueil : touche H
  • Fermer zoom : touche Échap.