Dans le terminal de la VM Ubuntu, NGINX et curl doivent être installés : sudo apt install nginx curl. Ouvrir une session administrateur avec sudo -i pour exécuter les blocs ci-dessous. Les commandes cat > fichier <<'EOF' créent les fichiers ; les variables NGINX comme $uri restent écrites telles quelles.
Objectifs
- Transmettre une requête au backend.
- Comparer une URI réécrite à une URI conservée.
1. Configurer NGINX
mkdir -p /var/www/tp-nginx-06cat > /var/www/tp-nginx-06/nginx.conf <<'EOF'
server {
listen 127.0.0.1:18082;
location /api/ {
proxy_pass http://127.0.0.1:19061/;
}
}
# Application simulée : affiche l’URI reçue
server {
listen 127.0.0.1:19061;
default_type text/plain;
location / { return 200 "backend TP-06 : $request_uri\n"; }
}
EOF- Le premier bloc
serverreçoit les requêtes du client sur le port18082. location /api/sélectionne les requêtes dont le chemin commence par/api/.proxy_pass http://127.0.0.1:19061/;transmet ces requêtes au backend sur le port19061. NGINX reçoit sa réponse et la renvoie au client : c’est cette transmission qui en fait un reverse proxy.- Le second bloc
serversimule l’application backend. Le client contacte le proxy, sans appeler directement ce backend.
- Dans ce TP-06,
proxy_passtransmet à un seul backend :127.0.0.1:19061. NGINX sert d’intermédiaire et peut modifier le chemin transmis, mais ne répartit pas les requêtes entre plusieurs serveurs. - Dans le TP-05,
proxy_passutilise le groupeupstream tp05_backends, qui contient deux backends. NGINX choisit un serveur du groupe pour chaque requête : c’est la répartition de charge. - Les configurations se ressemblent parce qu’un load balancer HTTP joue aussi le rôle de reverse proxy. Le TP-05 ajoute la répartition entre plusieurs backends à ce rôle d’intermédiaire.
2. Inclure et recharger
Ouvrir /etc/nginx/nginx.conf avec vim /etc/nginx/nginx.conf. Ajouter cette ligne à l’intérieur du bloc http { ... }, une seule fois :
include /var/www/tp-nginx-06/nginx.conf;Ce fichier contient des blocs server, inclus dans le bloc http de la configuration principale.
nginx -t
systemctl reload nginxRecharger uniquement si le test réussit. Sortie attendue de nginx -t :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulsystemctl reload nginx ne produit normalement aucune sortie en cas de succès.
3. Observer l’URI transmise
-i: affiche les en-têtes HTTP et le corps de la réponse.-I: envoie une requête HEAD et affiche uniquement les en-têtes.-sS: masque la progression tout en conservant les messages d’erreur.-L: suit les redirections vers l’adresse indiquée par l’en-têteLocation.-iL: combine l’affichage des en-têtes et le suivi des redirections.
Les sorties HTTP ci-dessous sont des exemples attendus : la date, la version NGINX, les en-têtes supplémentaires et leur ordre peuvent varier. Comparer surtout le statut, le type de contenu et le corps. Elles ne constituent pas une capture d’exécution sur votre VM.
curl -i "http://localhost:18082/api/article?x=1"HTTP/1.1 200 OK
Server: nginx/<version de votre VM>
Date: <date de la réponse>
Content-Type: text/plain
<autres en-têtes>
backend TP-06 : /article?x=1Avec le slash final de proxy_pass, le préfixe /api/ est remplacé par /. Les sous-segments et la query string sont conservés.
4. Conserver l’URI complète
Dans le fichier du TP, remplacer uniquement cette directive :
proxy_pass http://127.0.0.1:19061;nginx -t
systemctl reload nginxRecharger uniquement si le test réussit. Sortie attendue de nginx -t :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulsystemctl reload nginx ne produit normalement aucune sortie en cas de succès.
curl -i "http://localhost:18082/api/article?x=1"HTTP/1.1 200 OK
Server: nginx/<version de votre VM>
Date: <date de la réponse>
Content-Type: text/plain
<autres en-têtes>
backend TP-06 : /api/article?x=1Sans URI après le port dans proxy_pass, le backend reçoit le chemin complet, préfixe /api/ compris : cas d’une application qui expose elle-même ce chemin.
Complément — Observer les logs et provoquer une erreur
Effectuer cette section avant de retirer la configuration du TP. Conserver la session administrateur ouverte avec sudo -i. Les sections précédentes restent identiques.
1. Activer les traces du TP
Ouvrir vim /var/www/tp-nginx-06/nginx.conf. Ajouter cette ligne au début du fichier, en dehors des blocs server et upstream : le fichier est déjà inclus dans le bloc http.
log_format tp06_trace '$time_iso8601 "$request" status=$status upstream=$upstream_addr upstream_status=$upstream_status';Dans le serveur frontal qui écoute sur le port 18082, ajouter ces directives à côté de listen :
access_log /var/www/tp-nginx-06/access.log tp06_trace;
error_log /var/www/tp-nginx-06/error.log;access_logtrace les requêtes, leur statut et le backend contacté.error_logindique les erreurs rencontrées par NGINX.log_formatdéfinit les champs affichés :$requestest la requête du client,$statusle statut renvoyé,$upstream_addrle backend contacté et$upstream_statusson statut.
nginx -t
# Recharger uniquement si le test réussit
systemctl reload nginxLe test doit annoncer syntax is ok et test is successful. Le rechargement réussi ne produit normalement aucune sortie.
2. Retrouver les requêtes curl
Ces nouveaux logs ne contiennent pas les requêtes exécutées avant leur activation. Relancer les tests pour observer leurs traces :
curl -i "http://localhost:18082/api/article?x=1"
tail -n 10 /var/www/tp-nginx-06/access.logExemple de ligne attendue (date et répartition variables) :
<date> "GET /api/article?x=1 HTTP/1.1" status=200 upstream=127.0.0.1:19061 upstream_status=200Le log frontal garde le chemin demandé par curl. Après la section précédente, le backend doit aussi afficher /api/article?x=1 dans le corps de sa réponse.
tail -n 10affiche les dix dernières lignes.tail -fsuit les nouvelles lignes en direct ; arrêter avecCtrl+C.
3. Provoquer une erreur de connexion
Nous allons faire pointer temporairement le proxy vers un port sans backend, sans arrêter le service NGINX. Vérifier d’abord que le port 19999 est libre :
ss -ltn 'sport = :19999'-l sélectionne les sockets en écoute, -t TCP et -n conserve les adresses et ports numériques. Seule la ligne d’en-tête doit apparaître, sans ligne de socket :
State Recv-Q Send-Q Local Address:Port Peer Address:PortSi une ligne de socket apparaît, utiliser un autre port libre dans cet exemple.
Avec Vim, remplacer temporairement uniquement le proxy_pass du serveur frontal par :
proxy_pass http://127.0.0.1:19999;nginx -t
# Recharger uniquement si le test réussit
systemctl reload nginx
curl -i "http://localhost:18082/api/article?x=1"Réponse attendue : HTTP/1.1 502 Bad Gateway, avec une page d’erreur NGINX. Examiner ensuite les deux logs :
tail -n 10 /var/www/tp-nginx-06/access.log
tail -n 10 /var/www/tp-nginx-06/error.logExemple de ligne dans access.log :
<date> "GET /api/article?x=1 HTTP/1.1" status=502 upstream=127.0.0.1:19999 upstream_status=502Extrait caractéristique dans error.log (date, PID et identifiant de connexion variables) :
connect() failed (111: Connection refused) while connecting to upstreamLe client a bien atteint NGINX, mais NGINX n’a pas pu se connecter au backend. Le statut 502 montre le résultat ; Connection refused et l’adresse 127.0.0.1:19999 dans le log expliquent la cause. Il ne s’agit pas d’une erreur de syntaxe : nginx -t ne teste pas la disponibilité du backend.
4. Restaurer et vérifier
Remettre la directive initiale dans le serveur frontal :
proxy_pass http://127.0.0.1:19061;nginx -t
# Recharger uniquement si le test réussit
systemctl reload nginx
curl -i "http://localhost:18082/api/article?x=1"
tail -n 10 /var/www/tp-nginx-06/access.logLe dernier test doit revenir à 200. Les anciennes lignes 502 restent dans les logs : comparer la date et les dernières lignes. Vous pouvez ensuite effectuer la section « Retirer le TP » ci-dessous.
5. Retirer le TP
Dans le bloc http de /etc/nginx/nginx.conf, retirer uniquement la ligne include /var/www/tp-nginx-06/nginx.conf;, puis tester et recharger :
nginx -t
systemctl reload nginxRecharger uniquement si le test réussit. Sortie attendue de nginx -t :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulsystemctl reload nginx ne produit normalement aucune sortie en cas de succès.
Les fichiers du TP restent disponibles. Quitter la session administrateur avec exit.