Chapitre 7.2 — Installer & structurer Nginx
⏱️ TL;DR — On installe Nginx en une commande (
sudo apt install nginx), on le pilote comme n’importe quel service systemd (systemctl status/reload/restart nginx), et on grave le réflexe absolu : jamais dereloadsans unnginx -td’abord, qui teste la config et refuse de recharger une conf cassée. On explore ensuite l’arborescence Debian/Ubuntu —nginx.conf,sites-available/+sites-enabled/reliés par un lien symbolique,conf.d/,/var/www/, les logs de/var/log/nginx/— et l’anatomie d’une config : le contextehttpcontient desserver, qui contiennent deslocation. On écrit un premierserverblock, et on recharge sans coupure.
🎯 Objectifs
- Installer Nginx et vérifier qu’il tourne.
- Piloter le service :
status,reload,restart, et distinguerreloadderestart. - Ancrer le réflexe
nginx -tavant toutreload. - Connaître l’arborescence de config Debian/Ubuntu et le rôle de chaque dossier.
- Lire l’anatomie
http→server→locationet écrire un premierserverblock.
Installer Nginx
Sur Ubuntu/Debian, Nginx est dans les dépôts officiels. On rafraîchit l’index puis on installe.
sudo apt update # rafraîchit la liste des paquets
sudo apt install nginx # installe Nginx et ses dépendancesL’installation démarre et active déjà le service (il repartira au reboot). Vérifie-le tout de suite.
systemctl status nginx # doit afficher "active (running)"
curl -I http://localhost # doit répondre "HTTP/1.1 200 OK" et "Server: nginx"Si le pare-feu UFW est actif (Partie 5), pense à autoriser le web, sinon rien ne passera de l’extérieur.
sudo ufw allow 'Nginx Full' # ouvre les ports 80 et 443 (profil fourni par le paquet)
sudo ufw status # vérifie que 80/443 sont autorisés🐚 Au terminal — La séquence d’installation complète, à taper d’un bloc : mettre à jour, installer, ouvrir le pare-feu, vérifier. En quatre lignes, Nginx est en façade et joignable.
sudo apt update && sudo apt install nginx
sudo ufw allow 'Nginx Full'
systemctl status nginx
curl -I http://localhostPiloter le service systemd
Nginx est un service comme les autres (Partie 3). Les commandes que tu utiliseras tous les jours :
systemctl status nginx # état, PID, dernières lignes de log
sudo systemctl reload nginx # recharge la config SANS couper les connexions
sudo systemctl restart nginx # arrête puis relance (bref temps d'indisponibilite)
sudo systemctl enable nginx # démarrage automatique au boot (déjà fait par le paquet)reload vs restart : la nuance qui compte
reloaddemande à Nginx de relire sa config et d’appliquer les changements en douceur : les workers en cours terminent leurs requêtes, de nouveaux workers prennent la nouvelle config. Aucune connexion coupée. C’est ce que tu utilises 99 % du temps après avoir modifié une config.restarttue le processus et le relance : il y a une micro-coupure pendant laquelle le port n’écoute pas. Réserve-le aux cas oùreloadne suffit pas (par exemple après une mise à jour du binaire).
💡 Réflexe — Après chaque modification de config, le duo gagnant est toujours :
sudo nginx -t(tester) puissudo systemctl reload nginx(appliquer sans coupure). Jamaisrestartpar défaut, jamaisreloadsansnginx -tavant.
Le réflexe absolu : nginx -t
nginx -t parse toute ta configuration, vérifie la syntaxe et la cohérence, et te dit si elle est valide — sans rien recharger. C’est ta ceinture de sécurité.
sudo nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successfulSi tu as fait une faute (une accolade oubliée, un point-virgule manquant), il te le dit avec le numéro de ligne :
nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/formacampus:14
nginx: configuration file /etc/nginx/nginx.conf test failed⚠️ Piège — Faire
sudo systemctl reload nginxsansnginx -td’abord. Si la config est cassée, le comportement dépend des cas, mais tu risques surtout de te croire à jour alors que Nginx a refusé la nouvelle config (ou pire, de casser le service au prochainrestart/reboot, quand plus rien ne rattrapera l’erreur). Toujoursnginx -tavant de recharger. C’est legit statusde l’admin Nginx : gratuit, systématique, il t’évite les catastrophes.
L’arborescence Debian/Ubuntu
Le paquet Ubuntu/Debian organise la config d’une façon précise qu’il faut connaître (les autres distributions diffèrent un peu). Voici la carte.
/etc/nginx/
├── nginx.conf # config principale : contexte http, includes globaux
├── sites-available/ # TES configs de sites (un fichier par site), disponibles
│ └── formacampus # ex. le vhost de FormaCampus
├── sites-enabled/ # les sites ACTIVÉS = liens symboliques vers sites-available
│ └── formacampus -> ../sites-available/formacampus
├── conf.d/ # fragments de config globaux (chargés automatiquement)
├── snippets/ # bouts réutilisables à inclure
├── mime.types # correspondance extension -> type MIME
/var/www/ # racine des fichiers servis (statique)
│ └── html/ # site par défaut livré avec le paquet
/var/log/nginx/ # les logs
├── access.log # chaque requête reçue
└── error.log # les erreurs (config, 502, permissions...)Les rôles à retenir :
nginx.conf: le fichier maître. Il définit le contextehttpglobal (gzip, logs, timeouts par défaut) et surtout inclut les autres : il contient des lignesincludequi aspirentconf.d/*.confetsites-enabled/*.sites-available/: là où tu écris tes configs de site — un fichier par site. Y déposer un fichier ne l’active pas encore.sites-enabled/: les sites réellement chargés. La convention Debian : on n’y copie pas le fichier, on y crée un lien symbolique verssites-available/. Ainsi la source de vérité reste danssites-available, et activer/désactiver un site se fait en créant/supprimant un lien — sans toucher au contenu.conf.d/: des fragments globaux chargés automatiquement (utile pour de la config transverse)./var/www/: où vivent les fichiers statiques que Nginx sert (voir chapitre 7.3)./var/log/nginx/:access.log(chaque requête) eterror.log(les problèmes) — ton premier réflexe de débogage (chapitre 7.6).
Activer un site : le lien symbolique
Pour activer un site que tu as écrit dans sites-available/, tu crées un lien symbolique dans sites-enabled/ avec ln -s.
# active le site "formacampus"
sudo ln -s /etc/nginx/sites-available/formacampus /etc/nginx/sites-enabled/
sudo nginx -t # on teste, TOUJOURS
sudo systemctl reload nginx # on applique sans coupure
# désactiver un site = supprimer le lien (le fichier source reste intact)
sudo rm /etc/nginx/sites-enabled/formacampus💡 Réflexe — Le paquet installe un site de démonstration
defaultdanssites-enabled/. Sur un vrai serveur, tu le désactives (sudo rm /etc/nginx/sites-enabled/default) une fois ton propre site en place, pour qu’il ne réponde plus à la place du tien sur des requêtes inattendues.
L’anatomie d’une config : http → server → location
La config Nginx est une hiérarchie de contextes (des blocs délimités par { … }). Trois niveaux à connaître :
- Le contexte
http(dansnginx.conf) : les réglages globaux du web (gzip, format de logs, timeouts). Il contient tous lesserver. - Un contexte
server: un site. Il déclare sur quel port on écoute (listen), pour quel nom de domaine (server_name), et où sont les fichiers (root). Il contient deslocation. - Un contexte
location: que faire pour un chemin d’URL donné (/,/api/,/images/…). C’est là qu’on décide : servir un fichier, ou proxifier vers une app.
Un directive se termine toujours par un point-virgule ; un bloc par des accolades. Voici un premier server block minimal — il sert la racine par défaut sur le port 80, pour n’importe quel nom.
server {
listen 80; # écoute le HTTP sur le port 80
server_name _; # "_" = attrape-tout : n'importe quel nom d'hôte
root /var/www/html; # dossier racine des fichiers à servir
location / {
index index.html; # fichier servi par défaut pour un dossier
}
}Que dit ce bloc, ligne à ligne :
listen 80;— écoute les connexions HTTP sur le port 80.server_name _;— le_est un nom attrape-tout : ceserverrépond quel que soit le domaine demandé (on affinera au chapitre 7.5).root /var/www/html;— la racine : le chemin d’URL est cherché sous ce dossier.location / { … }— pour toute URL commençant par/(donc tout),index index.html;désigne le fichier par défaut d’un répertoire.
📚 La doc — Chaque directive Nginx (
listen,root,location,try_files…) a une page dédiée surnginx.org, avec le contexte où elle est valide (http, server, location) et ses valeurs par défaut. Quand tu hésites sur une directive, cherche-la là plutôt que de copier un snippet trouvé au hasard : tu sauras où elle a le droit d’aller et ce qu’elle fait vraiment.
🧭 Sur FormaCampus — L’équipe adopte d’emblée la convention Debian : un fichier par site dans
sites-available/(un pourformacampus.fr, un pourapi.formacampus.fr), activé par lien symbolique danssites-enabled/. Le sitedefaultdu paquet est supprimé. Chaque modif passe par le rituelsudo nginx -t && sudo systemctl reload nginx— inscrit dans leur checklist de déploiement pour que personne ne recharge une config non testée en pleine journée.
✏️ Exercices
Exercice 1 — Active un site proprement. Tu viens d’écrire /etc/nginx/sites-available/monsite. Donne la séquence exacte de commandes pour l’activer et l’appliquer sans coupure, dans le bon ordre.
✅ Solution
sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxD’abord le lien symbolique vers sites-enabled/ (activation), puis nginx -t pour tester la config, puis reload pour l’appliquer sans couper les connexions. Ne jamais recharger avant d’avoir testé.
Exercice 2 — Pourquoi ce message ? Tu tapes sudo systemctl reload nginx et rien ne change sur le site. Tu lances sudo nginx -t et tu obtiens nginx: [emerg] unexpected "}" in .../formacampus:14. Que s’est-il passé, et que corriges-tu ?
✅ Solution
Ta config a une erreur de syntaxe ligne 14 (une accolade } en trop ou une directive/point-virgule manquant juste avant). Nginx a refusé de charger la nouvelle config — d’où l’absence de changement. Tu corriges le fichier formacampus autour de la ligne 14 (souvent un ; oublié ou une accolade mal appariée), tu relances sudo nginx -t jusqu’à obtenir « test is successful », puis sudo systemctl reload nginx. Morale : nginx -t avant chaque reload t’aurait signalé l’erreur immédiatement.
🧠 Quiz de révision
1. Quelle commande installe Nginx sur Ubuntu, et qu’a-t-elle fait au service ?
sudo apt install nginx (après sudo apt update). Le paquet démarre et active (enable) déjà le service : Nginx tourne et repartira automatiquement au reboot.
2. À quoi sert nginx -t et quand l’utiliser ?
nginx -t et quand l’utiliser ?Il teste la configuration (syntaxe et cohérence) sans rien recharger, et signale les erreurs avec leur numéro de ligne. On l’utilise avant chaque reload — c’est le réflexe absolu pour ne jamais appliquer une config cassée.
3. Différence entre reload et restart ?
reload et restart ?reload relit la config en douceur : les requêtes en cours se terminent, aucune connexion n’est coupée. restart tue puis relance le processus, avec une micro-coupure. On privilégie reload au quotidien.
4. Quel est le rôle de sites-available/ vs sites-enabled/ ?
sites-available/ vs sites-enabled/ ?sites-available/ contient toutes tes configs de site (une par fichier), qu’elles soient actives ou non. sites-enabled/ contient uniquement les sites chargés, sous forme de liens symboliques vers sites-available/. Activer = créer le lien (ln -s) ; désactiver = supprimer le lien, sans toucher au fichier source.
5. Décris la hiérarchie des trois contextes de config.
Le contexte http (global, dans nginx.conf) contient les server ; un server représente un site (listen, server_name, root) et contient des location ; un location décide quoi faire pour un chemin d’URL donné (servir un fichier ou proxifier). Chaque directive finit par ;, chaque bloc par { … }.
Chapitre suivant : Servir du statique — root, try_files, les SPA, le cache des assets et les droits sur /var/www.