🌐 Serveurs Web — Apache & Nginx
| Formation | BTS SIO option SISR — IRIS Mediaschool |
|---|---|
| Bloc | B2 — Administration Systèmes & Réseaux |
| Module | M2.2 — Administration Linux |
| Prérequis | Shell Linux (C2.2.1), gestion des services systemd (C2.2.2) |
🎯 Objectifs
- Comprendre l'architecture et le fonctionnement d'un serveur web
- Installer et configurer Apache HTTP Server et Nginx
- Configurer des VirtualHosts (Apache) et des server blocks (Nginx)
- Mettre en place un reverse proxy avec Nginx
- Déployer des certificats SSL/TLS avec Let's Encrypt
- Sécuriser et optimiser un serveur web
📖 Architecture d'un serveur web
Un serveur web est un logiciel qui écoute sur un port réseau (généralement le port 80 pour HTTP et 443 pour HTTPS) et répond aux requêtes des clients (navigateurs web). Le cycle de fonctionnement est le suivant :
- Le client envoie une requête HTTP (GET, POST, etc.) au serveur
- Le serveur traite la requête : fichier statique, script dynamique ou proxy vers un backend
- Le serveur renvoie une réponse HTTP avec un code de statut (200, 404, 500…) et le contenu
Les deux serveurs web les plus utilisés sous Linux sont Apache HTTP Server et Nginx, qui représentent ensemble plus de 60% des serveurs web dans le monde.
📖 Apache HTTP Server
Installation
# Debian/Ubuntu
sudo apt update && sudo apt install apache2
# CentOS/RHEL
sudo dnf install httpd
# Démarrer et activer
sudo systemctl enable --now apache2 # ou httpd sur CentOS
Architecture modulaire
Apache fonctionne avec un système de modules chargeables dynamiquement. Les modules étendent les fonctionnalités du serveur :
# Lister les modules actifs
apache2ctl -M
# Activer/désactiver un module
sudo a2enmod rewrite
sudo a2dismod status
sudo systemctl restart apache2
MPM (Multi-Processing Modules)
Le MPM détermine comment Apache gère les connexions concurrentes :
| MPM | Fonctionnement | Usage recommandé |
|---|---|---|
| prefork | Un processus par connexion | Compatibilité maximale (mod_php) |
| worker | Multi-threads : plusieurs threads par processus | Meilleure performance mémoire |
| event | Comme worker + gestion asynchrone des connexions keep-alive | Recommandé pour les installations modernes |
Configuration Apache
La configuration principale se trouve dans /etc/apache2/apache2.conf (Debian) ou /etc/httpd/conf/httpd.conf (CentOS). L'organisation typique sous Debian :
/etc/apache2/sites-available/: fichiers de configuration des VirtualHosts/etc/apache2/sites-enabled/: liens symboliques vers les sites actifs/etc/apache2/mods-available/: modules disponibles/etc/apache2/mods-enabled/: modules actifs
VirtualHosts Apache
Les VirtualHosts permettent d'héberger plusieurs sites sur un même serveur :
# /etc/apache2/sites-available/monsite.conf
<VirtualHost *:80>
ServerName monsite.example.com
ServerAlias www.monsite.example.com
DocumentRoot /var/www/monsite
<Directory /var/www/monsite>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/monsite-error.log
CustomLog ${APACHE_LOG_DIR}/monsite-access.log combined
</VirtualHost>
# Activer le site
sudo a2ensite monsite.conf
sudo systemctl reload apache2
Fichiers .htaccess
Les fichiers .htaccess permettent de modifier la configuration Apache au niveau d'un répertoire sans redémarrer le serveur. Ils sont utiles pour les règles de réécriture d'URL, l'authentification et le contrôle d'accès :
# Exemple .htaccess : réécriture d'URL
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Les fichiers .htaccess sont lus à chaque requête et ralentissent les performances. En production, préférez intégrer les directives directement dans la configuration du VirtualHost.
📖 Nginx
Architecture événementielle
Contrairement à Apache qui crée un processus ou thread par connexion, Nginx utilise une architecture événementielle asynchrone. Un seul processus worker peut gérer des milliers de connexions simultanées grâce à une boucle d'événements non-bloquante.
Installation
# Debian/Ubuntu
sudo apt update && sudo apt install nginx
# Démarrer et activer
sudo systemctl enable --now nginx
Configuration Nginx
Le fichier principal est /etc/nginx/nginx.conf. La structure de configuration est hiérarchique :
# Structure de nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# Inclusion des server blocks
include /etc/nginx/sites-enabled/*;
}
Server blocks Nginx
# /etc/nginx/sites-available/monsite
server {
listen 80;
server_name monsite.example.com www.monsite.example.com;
root /var/www/monsite;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(css|js|png|jpg|gif|ico)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
access_log /var/log/nginx/monsite-access.log;
error_log /var/log/nginx/monsite-error.log;
}
# Activer le site
sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
sudo nginx -t # Tester la configuration
sudo systemctl reload nginx
📖 Contenu statique vs dynamique (PHP-FPM)
Un serveur web peut servir deux types de contenu :
- Statique : fichiers servis tels quels (HTML, CSS, JS, images). Nginx excelle dans ce domaine.
- Dynamique : contenu généré par un langage de programmation (PHP, Python, Node.js). Nécessite un interpréteur.
PHP-FPM (FastCGI Process Manager) est le gestionnaire de processus PHP recommandé. Il fonctionne comme un service séparé auquel Nginx transmet les requêtes PHP :
# Configuration Nginx pour PHP-FPM
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
📖 Reverse proxy avec Nginx
Nginx est très utilisé comme reverse proxy pour distribuer les requêtes vers des serveurs backend (Node.js, Python, Java…) :
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Les en-têtes X-Real-IP et X-Forwarded-For permettent au backend de connaître l'adresse IP réelle du client, et non celle du proxy.
📖 SSL/TLS et HTTPS
Certificats SSL/TLS
Le protocole HTTPS chiffre les communications entre le client et le serveur. Il nécessite un certificat SSL/TLS délivré par une autorité de certification (CA).
Let's Encrypt avec Certbot
Let's Encrypt fournit des certificats SSL gratuits et automatisés :
# Installer Certbot
sudo apt install certbot python3-certbot-nginx
# Obtenir et configurer automatiquement le certificat
sudo certbot --nginx -d monsite.example.com -d www.monsite.example.com
# Renouvellement automatique (via timer systemd)
sudo certbot renew --dry-run
Configuration HTTPS manuelle (Nginx)
server {
listen 443 ssl http2;
server_name monsite.example.com;
ssl_certificate /etc/letsencrypt/live/monsite.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monsite.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/monsite;
index index.html;
}
# Redirection HTTP vers HTTPS
server {
listen 80;
server_name monsite.example.com;
return 301 https://$server_name$request_uri;
}
📖 Logs d'accès et d'erreurs
| Serveur | Log d'accès | Log d'erreurs |
|---|---|---|
| Apache | /var/log/apache2/access.log | /var/log/apache2/error.log |
| Nginx | /var/log/nginx/access.log | /var/log/nginx/error.log |
# Analyser les requêtes en temps réel
sudo tail -f /var/log/nginx/access.log
# Top 10 des IP les plus actives
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Compter les codes d'erreur 404
grep " 404 " /var/log/nginx/access.log | wc -l
📖 Sécurité du serveur web
Mesures essentielles pour sécuriser un serveur web :
- En-têtes HTTP de sécurité :
# Nginx : en-têtes de sécurité
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
- Désactiver le directory listing : empêcher l'affichage du contenu des répertoires
# Nginx
autoindex off;
# Apache
Options -Indexes
- Rate limiting (Nginx) : limiter le nombre de requêtes par IP
# Définir la zone de limitation
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# Appliquer dans un location
location /api/ {
limit_req zone=api burst=20 nodelay;
}
📖 Comparaison Apache vs Nginx
| Critère | Apache | Nginx |
|---|---|---|
| Architecture | Processus/threads (prefork, worker, event) | Événementielle asynchrone |
| Performances (statique) | Bonnes | Excellentes |
| Performances (dynamique) | Bonnes (mod_php intégré) | Via FastCGI (PHP-FPM) |
| .htaccess | Oui | Non |
| Modules | Chargement dynamique | Compilés à l'installation |
| Reverse proxy | Possible (mod_proxy) | Natif et performant |
| Configuration | Décentralisée (.htaccess) | Centralisée |
| Cas d'usage | Hébergement mutualisé, compatibilité | Haute performance, reverse proxy, microservices |
En pratique, beaucoup d'architectures utilisent Nginx en frontal (reverse proxy, SSL, cache) devant Apache en backend (pour le support .htaccess et mod_php). C'est le meilleur des deux mondes.
📝 QCM — Testez vos connaissances
- Quels sont les deux serveurs web les plus utilisés sous Linux ?
- Quel fichier configure les virtual hosts sur Apache ?
- Quelle directive Nginx définit un serveur virtuel ?
- Comment tester la configuration Nginx sans redémarrer ?
- Quel module Apache active le HTTPS ?
- Quelle commande recharge Apache sans couper les connexions ?
📝 Afficher les corrections
- Apache et Nginx — Apache (httpd) et Nginx dominent le marché des serveurs web avec plus de 60% de parts combinées.
- Les fichiers dans /etc/apache2/sites-available/ — Chaque virtual host est défini dans un fichier de configuration activé via a2ensite.
- Le bloc server { } — Le bloc server dans /etc/nginx/sites-available/ définit le nom de domaine, le port et la racine du site.
- nginx -t — nginx -t vérifie la syntaxe de la configuration et signale les erreurs avant le rechargement.
- mod_ssl — Le module mod_ssl avec a2enmod ssl permet de configurer les certificats TLS/SSL.
- systemctl reload apache2 — reload relit la configuration sans interrompre les connexions actives, contrairement à restart.
Apache et Nginx sont les deux piliers du web sous Linux. Apache offre une grande flexibilité avec ses modules et .htaccess. Nginx excelle en performances, reverse proxy et contenu statique. Maîtrisez les VirtualHosts/server blocks, le SSL/TLS avec Let's Encrypt et les bonnes pratiques de sécurité.
