58 votes

Quel est le meilleur niveau de compression gzip de nginx ?

J'utilise le cache du proxy inverse de nginx avec gzip activé. Cependant, j'ai quelques problèmes avec les requêtes HTTP des applications Android vers mon service web Rails JSON. Il semble que lorsque je désactive le cache du proxy inverse, tout fonctionne bien car l'en-tête de réponse ne contient pas de gzip. Par conséquent, je pense que le problème est causé par gzip. Quel est le niveau de compression gzip le plus approprié ?

gzip               on;
gzip_http_version  1.0;
gzip_vary          on;
gzip_comp_level    6;
gzip_proxied       any;
gzip_types         text/plain text/css text/javascript application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss;

0 votes

6 est le niveau par défaut de gzip : linux.die.net/man/1/gzip

114voto

mcrumley Points 3551

J'ai testé cela sous nginx 1.3.9 avec deux fichiers, et voici les résultats que j'ai obtenus pour les différents niveaux :


text/html - phpinfo() :

0    55.38 KiB (100.00% of original size)
1    11.22 KiB ( 20.26% of original size)
2    10.89 KiB ( 19.66% of original size)
3    10.60 KiB ( 19.14% of original size)
4    10.17 KiB ( 18.36% of original size)
5     9.79 KiB ( 17.68% of original size)
6     9.62 KiB ( 17.37% of original size)
7     9.50 KiB ( 17.15% of original size)
8     9.45 KiB ( 17.06% of original size)
9     9.44 KiB ( 17.05% of original size)

application/x-javascript - jQuery 1.8.3 (non compressé) :

0    261.46 KiB (100.00% of original size)
1     95.01 KiB ( 36.34% of original size)
2     90.60 KiB ( 34.65% of original size)
3     87.16 KiB ( 33.36% of original size)
4     81.89 KiB ( 31.32% of original size)
5     79.33 KiB ( 30.34% of original size)
6     78.04 KiB ( 29.85% of original size)
7     77.85 KiB ( 29.78% of original size)
8     77.74 KiB ( 29.73% of original size)
9     77.75 KiB ( 29.74% of original size)

Je ne sais pas si cela est représentatif, mais cela devrait servir d'exemple. De plus, je n'ai pas pris en compte l'utilisation du CPU, mais d'après ces résultats, le niveau de compression idéal semble se situer entre 4 y 6 .


En outre, si vous utilisez le gzip_static vous pouvez vouloir pré-compresser vos fichiers (en PHP) :

function gzip_static($path)
{
    if ((extension_loaded('zlib') === true) && (is_file($path) === true))
    {
        $levels = array();
        $content = file_get_contents($path);

        foreach (range(1, 9) as $level)
        {
            $levels[$level] = strlen(gzencode($content, $level));
        }

        if ((count($levels = array_filter($levels)) > 0) && (min($levels) < strlen($content)))
        {
            if (file_put_contents($path . '.gz', gzencode($content, array_search(min($levels), $levels)), LOCK_EX) !== false)
            {
                return touch($path . '.gz', filemtime($path), fileatime($path));
            }
        }
    }

    return false;
}

Cela vous permet d'obtenir la meilleure compression possible sans sacrifier le CPU à chaque requête.

0 votes

Cela concorde avec les résultats obtenus à weblogs.asp.net/owscott/iis-7-compression-bien-mal-comment-faire qui montrent une chute importante des niveaux de compression après les niveaux 5 et 6.

27voto

growse Points 7740

Le niveau de compression gzip détermine simplement le degré de compression des données sur une échelle de 1 à 9, où 9 est le plus compressé. La contrepartie est que les données les plus compressées nécessitent généralement le plus de travail pour être compressées/décompressées, donc si vous l'avez réglé assez haut sur un site Web à fort volume, vous pouvez en ressentir les effets.

Il semble que vos problèmes soient davantage liés aux en-têtes HTTP des requêtes. Habituellement, le trafic HTTP compressé par gzip est accompagné de l'en-tête Content-Encoding: gzip en-tête. Si cet en-tête est abandonné quelque part, le client peut ne pas savoir qu'il doit décompresser la réponse.

0 votes

Comment désactiver la réponse gzip en utilisant l'en-tête de requête http du client ? J'ai essayé Accept-Encoding : '', mais cela ne fonctionne pas.

0 votes

D'après RFC2616 ( w3.org/Protocoles/rfc2616/rfc2616-sec14.html ) Je pense que vous voulez juste "Accept-Encoding : ' sans rien d'autre.

0 votes

Oui, j'ai ajouté l'en-tête Accept-Encoding avec une chaîne vide avec l'addon poster sur mozilla, et la réponse revient sans Content-Encoding : 'gzip'. Cependant, sur l'application Android, la réponse est toujours en gzip. J'ai vérifié ce qui a été mis en cache dans les répertoires de cache du proxy, nginx met en cache le contenu gzip, donc il est probable que les réponses reviennent en gzip. Comment résoudre ce problème ?

8voto

catmama3 Points 21

Si vous pouvez vraiment épargner des ressources CPU, vous pouvez utiliser 9, mais pour la plupart des sites une valeur de 2 est suffisante, puisque gzip ne réduit pas beaucoup le fichier après le niveau 1.

Edita: J'ai regardé Amazon CloudFront et il semble utiliser le niveau 6, probablement parce que ce niveau est celui qui exécute la décompression plus rapidement, améliorant ainsi les performances de rendu des pages.

2 votes

Ce n'est pas correct

2 votes

Pouvez-vous nous expliquer ce qui ne va pas ? Quoi qu'il en soit, j'ai mis à jour la réponse, j'ai fait quelques recherches supplémentaires et je vois que des sites comme Amazon CloudFront utilisent un niveau de compression de 6, probablement parce qu'ils sont plus soucieux de la vitesse de décompression (les pages se chargeront donc plus rapidement).

7 votes

1) La différence entre 2 et 6 n'est pas négligeable, elle peut aller jusqu'à 10-15%, regardez les données ou essayez vous-même. 2) le niveau de compression n'affecte pas la difficulté à décompresser (voir stackoverflow.com/questions/28452429/ )

1voto

Surfbutler Points 1108

Si vous avez un site Web à fort volume et que vous souhaitez tout de même bénéficier d'un niveau complet (9) de compression, la meilleure idée serait de placer votre contenu statique sur Amazon S3 ou un service de stockage d'objets similaire et de télécharger les fichiers compressés.

Vous voudrez toujours utiliser nginx pour compresser votre HTML, donc mieux vaut garder cette valeur à la normale, j'utilise 5 ici.

0 votes

J'aimerais utiliser votre suggestion, mais je n'ai pas encore inclus d'élément d'information. comp_level dans ma configuration, je ne peux donc pas dire à quel niveau je me trouve actuellement. Savez-vous quelles sont les valeurs par défaut ? Source ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X