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