07 - WEB
Le protocole HTTP
Propriétés :
-
Extensible : Les en-têtes HTTP rendent le protocole facile à étendre et à expérimenter. De nouvelles fonctionnalités peuvent être introduites par un simple accord entre un client et un serveur sur la sémantique d’un nouvel en-tête (Header).
-
Sans état : il n’y a pas de lien entre deux requêtes exécutées successivement sur la même connexion (peut être implémenté grâce à des cookies)
-
Utilise TCP (par défaut : port 80 pour HTTP et 443 pour HTTPS)
Flux HTTP
- Ouverture de connexion TCP (3 étapes) :
- Envoie de messages HTTP :
Par exemple:
GET / HTTP/1.1
Hôte : developer.mozilla.org
Accept-Language : fr
Réponse envoyée par le serveur :
HTTP/1.1 200 OK
Date : Sat, 09 Oct 2010 14:28:02 GMT
Serveur : Apache
Last-Modified : Tue, 01 Dec 2009 20:18:22 GMT
ETag : « 51142bc1-7449-479b075b2891b »
Accept-Ranges : bytes
Content-Length : 29769
Content-Type : text/html
<!doctype html>... (29769 octets de la page web demandée)
- Fermeture ou réutilisation de la connexion pour d’autres requêtes.
Serveur web
Serveur exécutant un service qui écoute (port 80 http ou 443 https) et répond à des requêtes HTTP (ou HTTPS) de clients.
- Héberge des pages web et d’autres documents web
- Fournit ces documents web et d’autres services en l’aide du protocole HTTP (ou HTTPS)
Transaction HTTP(S)
Une transaction HTTP est composée de plusieurs étape:
-
Le client envoie une requête au serveur.
-
Si c’est une page statique, le serveur passe directement au point 6 sinon il exécute un application.
-
Le serveur exécute l’application.
-
Le script peut envoyer une ou plusieurs requêtes à une base de données.
-
Le script prépare sa réponse.
-
Le serveur prépare sa réponse à envoyer.
-
Le client peut exécuter un script pour ajouter des fonctionnalités à la page s’il y a lieu.
-
Le client affiche la réponse.
Messages HTTP
Les messages HTTP, tels qu’ils sont définis dans la norme HTTP/1.1 sont lisibles.
Dans HTTP/2, ces messages sont intégrés dans une structure binaire, une trame, ce qui la rend moins lisible, mais la sémantique du message reste la même.
Il existe deux types de messages HTTP, les requêtes et les réponses, chacun ayant son propre format.
Requêtes HTTP
Les requêtes se composent des éléments suivants :
-
Une méthode HTTP , généralement GET, POST, ou un nom comme OPTIONS ou HEAD qui définit l’opération que le client veut effectuer. Généralement, un client souhaite récupérer une ressource (en utilisant GET) ou poster un formulaire (en utilisant POST), bien que d’autres opérations puissent être nécessaires dans d’autres cas.
-
Le chemin de la ressource à récupérer ; l’URL de la ressource dépouillée des éléments qui sont évidents dans le contexte, par exemple sans le protocole(http://), le domaine (ici, developer.mozilla.org), ou le port TCP (ici, 80).
-
La version du protocole HTTP
-
Des en-têtes optionnels qui transmettent des informations supplémentaires aux serveurs.
-
Un corps, pour certaines méthodes comme POST, similaire à celui des réponses, qui contient la ressource envoyée.
Réponse
Les réponses se composent des éléments suivants :
- La version du protocole HTTP qu’elles suivent.
- Un code d’erreur ou de succès, indiquant si la demande a réussi ou non, et pourquoi.
- Un code d’erreur/succès,
- Une brève description du code.
- Des en-têtes HTTP, comme pour les requêtes.
- (Optionnel) un corps (body) contenant la ressource recherchée.
HTTPS
-
HTTP ne possède pas de mécanisme de chiffrement.
-
Dans HTTPS, le protocole de communication est crypté à l’aide de Transport Layer Security (TLS) ou, anciennement, de Secure Sockets Layer (SSL). Le protocole est donc également appelé HTTP over TLS,ou HTTP over SSL.
-
Différence entre les deux :
-
Les URL HTTPS commencent par « https:// » et utilisent le port 443 par défaut
-
Les URL HTTP commencent par « http:// » et utilisent le port 80 par défaut.
-
Le protocole HTTP ne permet pas le chiffrement des données et est donc vulnérable aux attaques « man-in-the-middle » et « eavesdropping ».
-
HTTPS est conçu pour résister à ces attaques et est considéré comme sûr (à l’exception des implémentations HTTPS qui utilisent des versions obsolètes de SSL).
Introduction à NGINX
NGINX est un serveur performant et modulaire qui peut être utilisé, par exemple, comme :
- Serveur web
- Proxy inverse
- Équilibreur de charge
Dans cette partie, nous verrons comment implémenter un serveur Web en utilisant NGINX.
Installation et préparation de NGINX
Nous allons installer et configurer un serveur WEB Nginx sur une machine Alma Linux. Lancez une machine Alma Linux avec 2 interfaces, une en NAT et une en LAN Segment (par exemple 192.168.10.0/24)
Sur AlmaLinux
- Prérequis
Pour le moment, configurez une adresse IP statique pour l’interface dans le LAN segment
sudo nmcli con mod <nom de l'interface> ipv4.addresses 192.168.10.50/24
sudo nmcli con mod <nom de l'interface> ipv4.method manual
sudo nmcli con down <nom de l'interface>
sudo nmcli con up <nom de l'interface>
- Installation
dnf install nginx
- Autorisez les ports 80 (http) et 443 (https) pour que NGINX puisse fournir son service. Par exemple, pour ouvrir les ports par défaut pour HTTP (port 80) et HTTPS (port 443) dans firewalld, entrez :
firewall-cmd --permanent --add-port={80/tcp,443/tcp}
firewall-cmd --reload
- Activer le service nginx pour qu’il démarre automatiquement lorsque le système démarre puis activez nginx :
systemctl enable nginx
systemctl start nginx
En utilisant la configuration par défaut, NGINX fonctionne comme un serveur web sur le port 80 et fournit du contenu à partir du répertoire /usr/share/nginx/html/.
-
Éditez le fichier de configuration de NGINX, dans la rubrique server, ajoutez l’adresse IP de votre interface dans le LAN Segment :
-
Lancez une machine client ayant une interface sur le même LAN Segment, donnez-lui une adresse IP statique, puis allez sur un navigateur puis tapez l’adresse IP de votre serveur NGINX. Une page html par défaut devrait s’afficher :
Sur Ubuntu
- Prérequis
Faire les configurations réseau nécessaires (ajoutez une interface réseau à votre VM en LAN Segment pour le réseau 192.168.10.0/24
et attribuez-lui une addresse IP statique, comme 192.168.10.50
)
- Mettre à jour les paquets, installer
nginx
et vérifier l’installation
sudo apt update
sudo apt install nginx -y
sudo nginx -version
- Activez le service Nginx pour qu’il s’active tous à chaque démarrage puis lancez-le
sudo systemctl enable nginx
sudo systemctl start nginx
- Créer un hôte virtuel
Les hôtes virtuels permettent au serveur web de fournir des fichier web à partir d’un répertoire spécifique en utilisant un nom de domaine spécifique sur votre serveur.
Créez un nouveau fichier de configuration d’hôte virtuel dans le répertoire /etc/nginx/sites-available
. Par exemple, app.lab.com.conf
.
sudo nano /etc/nginx/sites-available/app.monlab.com.conf
Puis ajoutez les configurations suivantes :
server {
listen 192.168.10.50:80;
listen [::]:80;
server_name app.monlab.com;
root /var/www/app.monlab.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
La configuration ci-dessus écoute les connexions entrantes sur 192.168.10.50:80
en utilisant le domaine app.lab.com
et “sert” les fichiers de votre application web à partir du répertoire /var/www/app.monlab.com
sur votre serveur.
- Ajoutez un lien vers le repertoire /etc/nginx/sites-enabled pour activer l’hôte virtuel
sudo ln -s /etc/nginx/sites-available/app.monlab.com.conf /etc/nginx/sites-enabled/
- Créez un nouveau répertoire pour entreposer vos fichiers d’application
sudo mkdir -p /var/www/app.monlab.com
- Créer un nouvezu fichier
index.html
dans ce nouveau répertoire (pour tester)
echo "Test de ma page web" > /var/www/app.monlab.com/index.html
- Redémarrez le service NGINX
sudo systemctl restart nginx
Laboratoire 1: DNS et NGINX
Prenez un DNS autoritaire déjà configuré dans les laboratoire des cours précédents (si vous n’avez pas fini les labs de DNS, c’est le moment !). Ajoutez-y un enregistrement app.monlab.com pour votre serveur web.
Testez l’enregistrement en allant sur la machine client. Ajoutez l’adresse de votre serveur DNS dans les configurations puis lancer un navigateur et recherchez app.monlab.com.
Maintenant, si vous voulez que votre serveur NGINX serve votre propre page web statique, remplacez le fichier index.html dans le dossier /var/www/app.monlab.com/ par votre propre html !