03-comment-je-travaille/guides/perf-http.md

Performances HTTP (Brotli, Cache, Mesures)

Ce guide décrit des optimisations simples et mesurables pour améliorer les performances HTTP du VPS Codexia, ainsi que les commandes de vérification associées.

Objectifs validés pour Codexia:

  • HTTP/2 uniquement (pas de HTTP/3 pour l’instant)
  • Compression Brotli niveau 5 (Ă©quilibre CPU/ratio)
  • CSP en « report-only » documentĂ©e dans le guide sĂ©curitĂ©
  • Pas de CDN

1) Compression Brotli (avec fallback Gzip)

Activation recommandée cÎté Apache via une conf globale.

Configuration (ex: /etc/apache2/conf-available/compression.conf):

<IfModule mod_headers.c>
  # Variantes de cache correctes
  Header append Vary "Accept-Encoding"
  
</IfModule>

# Marque les requĂȘtes qui acceptent Brotli (token "br" dans Accept-Encoding)
SetEnvIfNoCase Accept-Encoding "(?:^|,|\s)br(?:\s*;q=[0-9.]+)?(?:,|$)" prefer_brotli=1

<IfModule mod_brotli.c>
  # Activer Brotli uniquement quand le client accepte br
  AddOutputFilterByType BROTLI_COMPRESS \
    text/html text/plain text/css application/javascript application/json image/svg+xml \
    env=prefer_brotli
  # Niveau recommandé: 5 (bon compromis CPU/ratio)
  BrotliCompressionQuality 5
</IfModule>

<IfModule mod_deflate.c>
  # DĂ©sactiver DEFLATE pour les requĂȘtes qui acceptent br
  RemoveOutputFilter DEFLATE \
    text/html text/plain text/css application/javascript application/json image/svg+xml \
    env=prefer_brotli
  # Fallback gzip pour les clients qui n'acceptent pas br
  AddOutputFilterByType DEFLATE \
    text/html text/plain text/css application/javascript application/json image/svg+xml
</IfModule>

Activation:

sudo a2enmod brotli
sudo a2enconf compression
sudo apache2ctl -t && sudo systemctl reload apache2

1.1) Priorité Brotli et deflate.conf (important)

Sur Debian/Ubuntu, le fichier /etc/apache2/mods-enabled/deflate.conf ajoute par défaut DEFLATE sur de nombreux types (dont text/html). Cela peut forcer gzip pour certains navigateurs si vous ne le neutralisez pas.

Recommandation: commenter les lignes AddOutputFilterByType DEFLATE ... dans mods-enabled/deflate.conf et laisser la gestion gzip uniquement dans votre compression.conf ci‑dessus.

# Exemple Ă  commenter dans /etc/apache2/mods-enabled/deflate.conf
# AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
# AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
# AddOutputFilterByType DEFLATE application/rss+xml
# AddOutputFilterByType DEFLATE application/wasm
# AddOutputFilterByType DEFLATE application/xml

Puis recharger Apache:

sudo apache2ctl -t && sudo systemctl reload apache2

Tests:

  • Encodage Brotli:
    # Utiliser GET (pas HEAD) pour vérifier la compression
    curl -sS --http2 -H "Accept-Encoding: br" -o /dev/null -D - https://madrien.fr/
    # Attendu (dans la réponse): Content-Encoding: br
    
  • Fallback Gzip:
    curl -sS --http2 -H "Accept-Encoding: gzip" -o /dev/null -D - https://votre-domaine
    # Attendu (dans la réponse): Content-Encoding: gzip
    
  • Sans encodage:
    curl -sS --http2 -H "Accept-Encoding: identity" -o /dev/null -D - https://votre-domaine
    # Attendu: (rien)
    
  • Simulation d’un navigateur moderne (Accept-Encoding: gzip, deflate, br, zstd):
    curl -sS --http2 -H "Accept-Encoding: gzip, deflate, br, zstd" \
      -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0" \
      -o /dev/null -D - https://votre-domaine/
    # Attendu: Content-Encoding: br (si priorité Brotli correctement appliquée)
    
  • Comparaison de tailles (ex: CSS):
    curl -s -H "Accept-Encoding: br" -w "br_size=%{size_download}\n" -o /dev/null https://votre-domaine/chemin.css
    curl -s -H "Accept-Encoding: gzip" -w "gz_size=%{size_download}\n" -o /dev/null https://votre-domaine/chemin.css
    # Attendu: br < gzip < identity
    

Notes:

  • Utiliser GET (curl avec -D - -o /dev/null) pour vĂ©rifier la compression. Les requĂȘtes HEAD (curl -I) peuvent ĂȘtre trompeuses.
  • Ne pas compresser les types dĂ©jĂ  compressĂ©s (jpg/jpeg/png/webp/pdf). Apache ne compresse pas ces types avec la config ci‑dessus.

2) Cache navigateur (assets statiques)

Pour les assets versionnés (hash dans le nom de fichier), utiliser une politique de cache longue.

Configuration (Ă  ajouter par exemple dans /etc/apache2/conf-available/cache-static.conf):

<IfModule mod_headers.c>
  <FilesMatch "\.(css|js|svg)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
</IfModule>

Activation:

sudo a2enconf cache-static
sudo apache2ctl -t && sudo systemctl reload apache2

Vérifications:

curl -I https://votre-domaine/build/app.css | egrep -i "^(cache-control|etag|last-modified):"
# ETag/304
ETAG=$(curl -sI https://votre-domaine/favicon.svg | awk -F': ' '/^etag:/ {print $2}')
curl -I -H "If-None-Match: $ETAG" https://votre-domaine/favicon.svg
# Si vous tapez l’ETag manuellement, bien Ă©chapper les guillemets:
curl -I -H 'If-None-Match: "14ea-6443b07e568ef"' https://votre-domaine/favicon.svg

3) Vary: Accept-Encoding

Utile pour les caches intermédiaires/CDN et pour éviter les collisions entre versions compressées/non-compressées.

Vérifier la présence:

curl -I https://votre-domaine | grep -i "^vary:"
# Attendu: Vary: Accept-Encoding (au minimum sur les types compressés)

Si absent, l’ajouter pour les types compressĂ©s (ex: via Header append Vary "Accept-Encoding").


4) Keep-Alive / réutilisation de connexion

Test simple:

curl -sw "\n%{time_starttransfer} %{time_total}\n" -o /dev/null https://votre-domaine; \
curl -sw "\n%{time_starttransfer} %{time_total}\n" -o /dev/null https://votre-domaine
# Attendu: 2e requĂȘte plus rapide (connexion/TLS rĂ©utilisĂ©s)

5) HTTP/2 uniquement (vérification)

curl -I --http2 https://votre-domaine -w "\nhttp/%{http_version}\n" -o /dev/null
# Attendu: http/2

6) Charge légÚre (sanity perf)

Commande (URL complĂšte requise):

ab -n 500 -c 50 https://votre-domaine/

Attendus:

  • Taux d’erreurs ≈ 0
  • Latences p95/p99 raisonnables (Ă  calibrer selon le VPS)

7) OCSP Stapling (perf TLS)

Voir détail dans le guide de déploiement. Vérification rapide:

openssl s_client -connect votre-domaine:443 -servername votre-domaine -status < /dev/null | grep -A3 "OCSP Response Status"
# Attendu: OCSP Response Status: successful

Assistant documentaire

Posez une question sur la documentation. Les rĂ©ponses citent leurs sources — un clic ouvre le document Ă  gauche.

Loading…
Loading the web debug toolbar…
Attempt #