Serveur Apache HTTP Version 2.4

Apache > Serveur HTTP > Documentation > Version 2.4 > Modules

# Module Apache mod_deflate

Langues Disponibles: en | fr | ja | ko

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.

### Directives

### Sujets

- Exemples de configurations
- Activation de la compression
- Prise en compte des serveurs mandataires

### Voir aussi

- Les filtres

## Exemples de configurations

Voici un exemple simple de configuration pour les impatients.

### Ne comprime que certains types de documents

`AddOutputFilterByType DEFLATE text/html text/plain text/xml`

La configuration suivante, tout en produisant un contenu encore plus comprimé, est aussi beaucoup plus compliquée. N'utilisez pas cet exemple si vous ne comprenez pas tous les détails de la configuration.

### Comprime tout, sauf les images

`<Location />
# Insère le filtre
SetOutputFilter DEFLATE
# Netscape 4.x a quelques problèmes ...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 ont d'autres problèmes
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE se fait passer pour Netscape, mais ça marche
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Ne pas comprimer les images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# On s'assure que les mandataires ne servent pas le mauvais # contenu
Header append Vary User-Agent env=!dont-vary
</Location>`

## Activation de la compression

### 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`

Certains navigateurs populaires ne gèrent pas la compression de tous les contenus, et pour résoudre ce problème, vous pouvez définir la note `gzip-only-text/html` à `1` pour ne permettre que la compression des fichiers html (voir ci-dessous). Si vous définissez cette note à toute autre valeur que `1`, elle sera ignorée.

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 "/racine-de-votre-serveur/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>`

Pour les navigateurs qui ont des problèmes avec la compression de tous les types de fichiers, vous pouvez utiliser la directive `BrowserMatch` pour définir la note `no-gzip`, pour le navigateur considéré, de façon à ce qu'aucune compression ne soit effectuée. Vous pouvez combiner `no-gzip` avec `gzip-only-text/html` afin d'obtenir le meilleur résultat possible. Dans ce cas, la première note l'emporte sur la deuxième. Considérons l'extrait suivant de l'exemple de configuration de la section précédente :

`BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html`

Tout d'abord, on recherche un en-tête `User-Agent` qui signale un navigateur Netscape version 4.x. Ces versions ne gèrent pas la compression des types de fichiers autres que `text/html`. En outre, les versions 4.06, 4.07 et 4.08 ont des problèmes avec la décompression des fichiers html. Par conséquent, nous désactivons complètement le filtre deflate pour ces derniers.

La troisième directive `BrowserMatch` corrige l'identité sous laquelle se présente le navigateur ; en effet, Microsoft Internet Explorer s'identifie aussi lui-même comme "Mozilla/4", mais par contre, il sait gérer les contenus compressés. On recherche donc la chaîne additionnelle "MSIE" (`\b` signifie "par mots entiers") dans l'en-tête `User-Agent`, et si elle est trouvée, on annule les restrictions définies auparavant.

### Note

Le filtre `DEFLATE` 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'environnement `force-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 *`

## DeflateBufferSize Directive

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.

## DeflateCompressionLevel Directive

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
Compatibilité: | Cette directive est disponible depuis la version 2.0.45 d'Apache

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

## DeflateFilterNote Directive

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
Compatibilité: | type est disponible depuis la version 2.0.45 d'Apache

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

- `mod_log_config`

## DeflateMemLevel Directive

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

## DeflateWindowSize Directive

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.

Langues Disponibles: en | fr | ja | ko