Quel est le meilleur niveau de compression gzip nginx?

44

J'utilise le cache de proxy inverse nginx avec gzip activé. Cependant, des requêtes HTTP d'applications adressées à mon service Web JSON Rails m'ont posé quelques problèmes. Il semble que lorsque je désactive le cache de proxy inverse, cela fonctionne bien car l'en-tête de réponse est fourni sans 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;
Chamnap
la source

Réponses:

18

Le niveau de compression gzip détermine simplement le niveau de compression des données sur une échelle allant de 1 à 9, où 9 est le plus compressé. Le compromis est que les données les plus compressées nécessitent généralement le plus de travail de compression / décompression. Par conséquent, si vous les définissez assez haut sur un site Web à volume élevé, vous pouvez en ressentir les effets.

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

croître
la source
Comment désactiver la réponse gzip en utilisant l'en-tête de requête http du client? J'essaie d'accepter l'encodage: '', mais cela ne fonctionne pas.
Chamnap
De RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Je pense que vous voulez juste "Accepter-Encodage:" sans rien suivre.
Growse
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 sans Content-Encoding: 'gzip'. Cependant, sur l'application Android, il retourne toujours dans 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, il s'agit donc probablement de réponses dans gzip. Comment résoudre ceci?
Chamnap
Certaines sources suggèrent que les ressources de décompression n'augmentent pas avec le niveau de compression. Les ressources diminuent dans certains cas lorsque le niveau de compression augmente. stackoverflow.com/questions/28452429/…
utilisateur2208096
90

J'ai testé cela sous nginx 1.3.9 avec deux fichiers et ce sont 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 suis pas sûr que ce soit représentatif, mais cela devrait servir d'exemple. De plus, je n'ai pas pris en compte l'utilisation du processeur, mais à partir de ces résultats, le niveau de compression idéal semble être compris entre 4et 6.


De plus, si vous utilisez le gzip_staticmodule, vous voudrez peut-être 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 processeur à chaque requête.

Alix Axel
la source
cette jibes avec des résultats à weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much qui montrent une forte baisse des niveaux de compression après les niveaux 5 et 6.
Jeff Atwood
6

Si vous pouvez réellement économiser les ressources du processeur, vous pouvez utiliser 9, mais pour la plupart des sites, une valeur de 2 suffit, car gzip ne réduit pas beaucoup le fichier après le niveau 1.

Edit: J'ai consulté Amazon CloudFront qui semble utiliser le niveau 6, probablement parce que ce niveau exécute la décompression plus rapidement, ce qui améliore les performances de rendu de la page.

DiegoG
la source
Ce n'est pas correct
calumbrodie
2
Cloud, tu expliques ce qui ne va pas? Quoi qu'il en soit, j'ai mis à jour la réponse, j'ai cherché un peu plus et je vois que des sites comme Amazon CloudFront utilisent un niveau de compression de 6, probablement parce qu'il est préférable de choisir la vitesse de décompression (ainsi, les pages se chargeront plus rapidement).
DiegoG
1) La différence entre 2 et 6 n’est pas anodine, elle peut aller jusqu’à 10-15%, consulter les données ou l’essayer vous-même. 2) le niveau de compression n'affecte pas la difficulté à décompresser (voir stackoverflow.com/questions/28452429/… )
calumbrodie le
0

Si vous avez un site Web à volume élevé et souhaitez toujours disposer d'un niveau de compression complet (9), la meilleure idée serait de placer votre contenu statique sur Amazon S3 ou des services de stockage d'objets similaires et de télécharger les fichiers compressés.

Vous voudriez toujours utiliser nginx pour compresser votre code HTML, il est donc préférable de garder cette valeur normale, j’utilise 5 ici.

Aftab Naveed
la source
Je voudrais utiliser votre suggestion, mais pour l’instant je n’en ai pas inclus un comp_leveldans ma configuration, je ne peux donc pas dire à quel niveau je suis actuellement. Savez-vous quels sont les défauts? La source?
Hassan Baig