🌐 Serveurs Web — Apache & Nginx

Bloc 2 Module 2.2 BTS SIO SISR
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Administration Systèmes & Réseaux
ModuleM2.2 — Administration Linux
PrérequisShell 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 :

  1. Le client envoie une requête HTTP (GET, POST, etc.) au serveur
  2. Le serveur traite la requête : fichier statique, script dynamique ou proxy vers un backend
  3. 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 :

MPMFonctionnementUsage recommandé
preforkUn processus par connexionCompatibilité maximale (mod_php)
workerMulti-threads : plusieurs threads par processusMeilleure performance mémoire
eventComme worker + gestion asynchrone des connexions keep-aliveRecommandé 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]
⚠️ Attention

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;
    }
}
💡 Astuce

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

ServeurLog d'accèsLog 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èreApacheNginx
ArchitectureProcessus/threads (prefork, worker, event)Événementielle asynchrone
Performances (statique)BonnesExcellentes
Performances (dynamique)Bonnes (mod_php intégré)Via FastCGI (PHP-FPM)
.htaccessOuiNon
ModulesChargement dynamiqueCompilés à l'installation
Reverse proxyPossible (mod_proxy)Natif et performant
ConfigurationDécentralisée (.htaccess)Centralisée
Cas d'usageHébergement mutualisé, compatibilitéHaute performance, reverse proxy, microservices
💡 Astuce

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

  1. Quels sont les deux serveurs web les plus utilisés sous Linux ?
  2. Quel fichier configure les virtual hosts sur Apache ?
  3. Quelle directive Nginx définit un serveur virtuel ?
  4. Comment tester la configuration Nginx sans redémarrer ?
  5. Quel module Apache active le HTTPS ?
  6. Quelle commande recharge Apache sans couper les connexions ?
📝 Afficher les corrections
  1. Apache et Nginx — Apache (httpd) et Nginx dominent le marché des serveurs web avec plus de 60% de parts combinées.
  2. Les fichiers dans /etc/apache2/sites-available/ — Chaque virtual host est défini dans un fichier de configuration activé via a2ensite.
  3. Le bloc server { } — Le bloc server dans /etc/nginx/sites-available/ définit le nom de domaine, le port et la racine du site.
  4. nginx -t — nginx -t vérifie la syntaxe de la configuration et signale les erreurs avant le rechargement.
  5. mod_ssl — Le module mod_ssl avec a2enmod ssl permet de configurer les certificats TLS/SSL.
  6. systemctl reload apache2 — reload relit la configuration sans interrompre les connexions actives, contrairement à restart.
💡 À retenir

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

← Cours précédent Cours suivant →