Serveur Apache HTTP Version 2.4
Module Apache mod_deflate
Description: | Comprime le contenu avant de le servir au client |
---|---|
Statut: | Extension |
Identificateur de Module: | deflate_module |
Fichier Source: | mod_deflate.c |
Sommaire
Le module mod_deflate
implémente le filtre de
sortie DEFLATE
qui permet de comprimer la sortie de
votre serveur avant de l'envoyer au client sur le réseau.
Codages supportés
Le seul codage supporté est gzip
afin d'assurer une complète
compatibilité avec les anciens navigateurs. Le codage deflate
n'est donc pas supporté ; voir à ce sujet la documentation de zlib
pour une explication détaillée.
Exemples de configurations
Compression et TLS
Certaines applications web sont vulnérables aux attaques visant le vol d'information lorsqu'une connexion TLS transmet des données compressées par deflate. Pour plus de détails, étudiez les attaques de la famille "BREACH".
Voici une configuration simple qui comprime les contenus à base de texte courants.
Ne comprime que certains types de documents
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
Activation de la compression
Compression et TLS
Certaines applications web sont vulnérables aux attaques pour vol d'information lorsque la connexion TLS transmet des données compressées par deflate. Pour plus d'informations, voir en détails la famille d'attaques de type "BREACH".
Compression de la sortie
La compression est implémentée par le filtre DEFLATE
. La
directive suivante active la compression des documents dans le
conteneur où elle est placée :
SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip
Si vous voulez limiter la compression à certains types MIME
particuliers, vous pouvez utiliser la directive AddOutputFilterByType
. Voici un exemple
où la compression n'est activée que pour les fichiers html de la
documentation d'Apache :
<Directory "/your-server-root/manual"> AddOutputFilterByType DEFLATE text/html </Directory>
Note
Le filtreDEFLATE
est toujours inséré après les
filtres RESOURCE comme PHP ou SSI. Il n'affecte jamais les
sous-requêtes internes.
Note
La variable d'environnementforce-gzip
, définie à
l'aide de la directive SetEnv
, permet d'ignorer la
configuration de votre navigateur quant aux codages acceptés, et
d'envoyer sans condition une sortie comprimée.
Décompression de la sortie
Le module mod_deflate
fournit aussi un filtre
permettant de décomprimer un corps de réponse comprimé par gzip.
Pour activer cette fonctionnalité, vous devez insérer le filtre
INFLATE
dans la chaîne de filtrage en sortie via la
directive SetOutputFilter
ou
AddOutputFilter
, comme
dans l'exemple suivant :
<Location "/dav-area"> ProxyPass "http://example.com/" SetOutputFilter INFLATE </Location>
Dans cet exemple, les sorties comprimées par gzip en provenance de example.com seront décomprimées afin de pouvoir être éventuellement traitées par d'autres filtres.
Décompression de l'entrée
Le module mod_deflate
fournit également un filtre
permettant de décomprimer un corps de requête comprimé par gzip.
Pour activer cette fonctionnalité, vous devez insérer le filtre
DEFLATE
dans la chaîne de filtrage en entrée via la
directive SetInputFilter
ou
AddInputFilter
, comme
dans l'exemple suivant :
<Location "/dav-area"> SetInputFilter DEFLATE </Location>
Désormais, si une requête contient un en-tête
Content-Encoding: gzip
, son corps sera
automatiquement décomprimé. Peu de navigateurs sont actuellement
en mesure de comprimer les corps de requêtes. Cependant,
certaines applications spécialisées supportent les requêtes
comprimées, comme par exemple certains clients WebDAV.
Note à propos de l'en-tête
Content-Length
Si vous évaluez vous-même la taille du corps de requête,
ne faites pas confiance à l'en-tête
Content-Length
! L'en-tête
Content-Length indique la longueur des données en provenance du
client, et non la quantité d'octets que représente le
flux de données décompressé.
Prise en compte des serveurs mandataires
Le module mod_deflate
envoie un en-tête de
réponse HTTP Vary: Accept-Encoding
pour avertir les
mandataires qu'une réponse enregistrée dans le cache ne doit être
envoyée qu'aux clients qui ont envoyé l'en-tête de requête
Accept-Encoding
approprié. Ceci permet d'éviter l'envoi
d'un contenu comprimé à un client qui ne sera pas en mesure
de l'interpréter.
Si vous avez défini des exclusions spécifiques dépendant, par
exemple, de l'en-tête User-Agent
, vous devez
ajouter manuellement des données à l'en-tête Vary
afin
d'informer les mandataires des restrictions supplémentaires. Par
exemple, dans la configuration classique où l'addition du filtre
DEFLATE
dépend du contenu de l'en-tête
User-Agent
, vous devez spécifier :
Header append Vary User-Agent
Si votre décision de comprimer le contenu dépend d'autres
informations que celles contenues dans les en-têtes de la requête
(par exemple la version HTTP), vous devez attribuer à l'en-tête
Vary
la valeur *
, ce qui permet d'empêcher
les mandataires compatibles de tout mettre en cache.
Exemple
Header set Vary *
Servir du contenu précompressé
Comme mod_deflate
recompresse le contenu demandé à
chaque requête, il est possible de gagner en performances en
précompressant ce contenu, et en forçant mod_deflate à servir ce
contenu précompressé sans avoir à le recompresser à chaque requête.
Pour ce faire, utilisez une configuration du style :
<IfModule mod_headers.c> # Servir des fichiers CSS compressés avec gzip, s'ils existent, et # si le client accepte gzip. RewriteCond "%{HTTP:Accept-encoding}" "gzip" RewriteCond "%{REQUEST_FILENAME}\.gz" "-s" RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA] # Servir des fichiers JS compressés avec gzip, s'ils existent, et # si le client accepte gzip. RewriteCond "%{HTTP:Accept-encoding}" "gzip" RewriteCond "%{REQUEST_FILENAME}\.gz" "-s" RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA] # Servir des types de contenus corrects, et empêcher mod_deflate # d'effectuer un double gzip. RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1] RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1] <FilesMatch "(\.js\.gz|\.css\.gz)$"> # Servir le type de codage correct. Header append Content-Encoding gzip # Force les mandataires à mettre en cache séparément les fichiers # css/js gzippés & non gzippés. Header append Vary Accept-Encoding </FilesMatch> </IfModule>
Directive DeflateBufferSize
Description: | Taille du fragment que zlib devra comprimer en une seule fois |
---|---|
Syntaxe: | DeflateBufferSize valeur |
Défaut: | DeflateBufferSize 8096 |
Contexte: | configuration du serveur, serveur virtuel |
Statut: | Extension |
Module: | mod_deflate |
La directive DeflateBufferSize
permet de
spécifier la taille en octets du fragment que zlib devra comprimer
en une seule fois. Si la taille de la réponse compressée est supérieure à
celle spécifiée par cette directive, httpd passera à un mode d'encodage
fragmenté (l'en-tête HTTP Transfer-Encoding
prend la valeur
Chunked
), ceci ayant comme effet de bord de ne définir aucun
en-tête HTTP Content-Length
. Il est important de connaître ce
comportement, particulièrement lorsque httpd travaille derrière des
mandataires inverses avec mise en cache, ou lorsque httpd est configuré pour
utiliser mod_cache
et mod_cache_disk
car
les réponses HTTP sans en-tête Content-Length
peuvent ne pas
être mises en cache.
Directive DeflateCompressionLevel
Description: | Le niveau de compression que nous appliquons à la sortie |
---|---|
Syntaxe: | DeflateCompressionLevel valeur |
Défaut: | La valeur par défaut de zlib |
Contexte: | configuration du serveur, serveur virtuel |
Statut: | Extension |
Module: | mod_deflate |
La directive DeflateCompressionLevel
permet de spécifier le niveau de compression à utiliser ; plus
grande est la valeur, meilleure sera la compression, mais plus grand
sera aussi le temps CPU nécessaire pour effectuer le
traitement.
La valeur doit être comprise entre 1 (compression minimale) et 9 (compression maximale).
Directive DeflateFilterNote
Description: | Enregistre le taux de compression sous la forme d'une note à des fins de journalisation |
---|---|
Syntaxe: | DeflateFilterNote [type] nom de la note |
Contexte: | configuration du serveur, serveur virtuel |
Statut: | Extension |
Module: | mod_deflate |
La directive DeflateFilterNote
permet de
spécifier qu'une note à propos du taux de compression doit être
attachée à la requête. Le nom de la note est passé sous la forme
d'un argument de la directive. Vous pouvez utiliser cette note à des
fins statistiques en enregistrant sa valeur dans votre journal des accès.
Exemple
DeflateFilterNote ratio LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate CustomLog "logs/deflate_log" deflate
Pour extraire des informations plus précises de vos journaux, vous pouvez utiliser l'argument type pour spécifier le type de données de la note enregistrée dans le journal. type peut prendre une des valeurs suivantes :
Input
- Enregistre dans la note la taille en octets du flux en entrée du filtre.
Output
- Enregistre dans la note la taille en octets du flux en sortie du filtre.
Ratio
- Enregistre le taux de compression (
sortie/entrée * 100
) dans la note. Il s'agit de la valeur par défaut si l'argument type est omis.
Vous pouvez donc configurer votre journalisation de la manière suivante :
Journalisation détaillée
DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate CustomLog "logs/deflate_log" deflate
Voir aussi
Directive DeflateInflateLimitRequestBody
Description: | Taille maximale des corps de requête décompressés |
---|---|
Syntaxe: | DeflateInflateLimitRequestBodyvalue |
Défaut: | Aucune limite, mais LimitRequestBody s'applique après la
compression |
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess |
Statut: | Extension |
Module: | mod_deflate |
Compatibilité: | Disponible à partir de la version 2.4.10 du serveur HTTP Apache |
La directive
DeflateInflateLimitRequestBody
permet de
spécifier la taille maximale d'un corps de requête décompressé. Si
elle n'est pas définie, c'est la valeur de la directive LimitRequestBody
qui s'applique au corps
de requête décompressé.
Directive DeflateInflateRatioBurst
Description: | Nombre maximal de fois que le ratio de décompression d'un corps de requête peut être dépassé |
---|---|
Syntaxe: | DeflateInflateRatioBurst value |
Défaut: | 3 |
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess |
Statut: | Extension |
Module: | mod_deflate |
Compatibilité: | Disponible à partir de la version 2.4.10 du serveur HTTP Apache |
La directive DeflateInflateRatioBurst
permet de spécifier le nombre maximal de fois que la valeur de la
directive DeflateInflateRatioLimit
peut être
dépassé avant l'arrêt du traitement de la requête.
Directive DeflateInflateRatioLimit
Description: | Ratio de décompression maximum pour les corps de requêtes |
---|---|
Syntaxe: | DeflateInflateRatioLimit value |
Défaut: | 200 |
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess |
Statut: | Extension |
Module: | mod_deflate |
Compatibilité: | Disponible à partir de la version 2.4.10 du serveur HTTP Apache |
La directive DeflateInflateRatioLimit
permet de définir le ratio maximum entre la taille d'un corps de
requête compressé et sa taille décompressée. Ce ratio est vérifié au
fur et à mesure de
l'arrivée du corps de requête, et s'il est dépassé plus de
DeflateInflateRatioBurst
fois, le traitement
de la requête est interrompu.
Directive DeflateMemLevel
Description: | La quantité de mémoire utilisable par zlib pour la compression |
---|---|
Syntaxe: | DeflateMemLevel valeur |
Défaut: | DeflateMemLevel 9 |
Contexte: | configuration du serveur, serveur virtuel |
Statut: | Extension |
Module: | mod_deflate |
La directive DeflateMemLevel
permet de
spécifier la quantité de mémoire utilisable par zlib pour la
compression (une valeur comprise entre 1 et 9).
Directive DeflateWindowSize
Description: | Taille de la fenêtre de compression zlib |
---|---|
Syntaxe: | DeflateWindowSize valeur |
Défaut: | DeflateWindowSize 15 |
Contexte: | configuration du serveur, serveur virtuel |
Statut: | Extension |
Module: | mod_deflate |
La directive DeflateWindowSize
permet de
spécifier la fenêtre de compression zlib (une valeur comprise entre
1 et 15). En général, plus grande sera la taille de la fenêtre, plus
grand sera le taux de compression auquel on pourra s'attendre.