Frage Was ist der beste nginx-Komprimierungsgzip-Level?


Ich benutze Nginx Reverse Proxy Cache mit Gzip aktiviert. Ich habe jedoch Probleme mit HTTP-Anfragen von Android-Anwendungen an meinen Rails JSON-Webdienst. Es scheint, wenn ich den Reverse-Proxy-Cache ausschalte, funktioniert es in Ordnung, weil der Antwort-Header ohne Gzip kommt. Daher denke ich, dass das Problem von gzip verursacht wird. Was ist die am besten geeignete Ebene der GZIP-Komprimierung?

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;

37
2018-03-29 09:14


Ursprung




Antworten:


Das Niveau der gzip-Komprimierung bestimmt einfach, wie komprimiert die Daten auf einer Skala von 1-9 sind, wobei 9 am meisten komprimiert ist. Der Kompromiss besteht darin, dass die am meisten komprimierten Daten in der Regel die meiste Arbeit erfordern, um komprimiert / dekomprimiert zu werden. Wenn Sie sie auf einer hochvolumigen Website ziemlich hoch eingestellt haben, können Sie ihre Wirkung spüren.

Es scheint, dass Ihre Probleme mehr mit den HTTP-Headern der Anforderungen zusammenhängen. In der Regel wird gzip-komprimierter HTTP-Verkehr von der Content-Encoding: gzip Header. Wenn dies irgendwo gelöscht wird, weiß der Client möglicherweise nicht, dass er die Antwort dekomprimieren muss.


15
2018-03-29 09:22



Wie kann ich die gzip-Antwort mit dem HTTP-Request-Header vom Client deaktivieren? Ich versuche Accept-Encoding: '', aber es funktioniert nicht. - Chamnap
Von RFC2616 (w3.org/Protocols/rfc2616/rfc2616-sec14.html) Ich denke du willst einfach 'Accept-Encoding' mit nichts folgen. - growse
Ja, ich habe den Header Accept-Encoding mit einem leeren String mit Poster-Addon auf Mozilla und die Antwort ohne Content-Encoding: 'gzip' hinzugefügt. In der Android-App gibt es jedoch immer in gzip zurück. Ich habe überprüft, was in den Proxy-Cache-Verzeichnissen zwischengespeichert wurde, nginx zwischenspeichert den Inhalt von gzip, daher sind es wahrscheinlich Antworten in gzip. Wie löst man das? - Chamnap
Einige Quellen weisen darauf hin, dass die Dekomprimierungsressourcen nicht ansteigen, wenn der Komprimierungsgrad steigt. Ressourcen tatsächlich verringern in einigen Fällen, wenn der Komprimierungsgrad ansteigt. stackoverflow.com/questions/28452429/... - user2208096


Ich habe dies unter nginx 1.3.9 mit zwei Dateien getestet, und das waren die Ergebnisse, die ich für die verschiedenen Ebenen erhalten habe:


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 (Unkomprimiert):

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)

Ich bin mir nicht sicher, wie repräsentativ das ist, aber es sollte als Beispiel dienen. Außerdem habe ich die CPU-Auslastung nicht berücksichtigt, aber von diesen Ergebnissen scheint die ideale Komprimierungsstufe zu sein 4 und 6.


Wenn Sie das gzip_static Modul, möchten Sie vielleicht Ihre Dateien vorkomprimieren (in 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;
}

Dadurch erhalten Sie die bestmögliche Komprimierung, ohne die CPU bei jeder Anforderung zu beeinträchtigen.


77
2017-11-27 16:15



das kitzelt mit Ergebnissen bei weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much welche nach Level 5 und 6 einen großen Abfall in den Kompressionslevels zeigen. - Jeff Atwood


Wenn Sie CPU-Ressourcen wirklich schonen können, können Sie 9 verwenden, aber für die meisten Sites ist ein Wert von 2 genug, da gzip die Datei nicht viel nach Level 1 reduziert.

Bearbeiten: Ich schaute auf Amazon CloudFront und es scheint Ebene 6 zu verwenden, wahrscheinlich weil diese Ebene diejenige ist, die Dekomprimierung schneller ausführt, wodurch die Leistung beim Seitenrendern verbessert wird.


6
2018-05-09 11:11



Das ist nicht korrekt - calumbrodie
Cloud du erklärst was falsch daran ist? Wie auch immer, ich aktualisierte die Antwort, ich recherchierte ein bisschen mehr und ich sehe, dass Websites wie Amazon CloudFront eine Komprimierungsstufe von 6 verwenden, wahrscheinlich weil es am besten über die Dekompressionsgeschwindigkeit ist (daher werden die Seiten schneller geladen). - DiegoG
1) Der Unterschied zwischen 2 und 6 ist nicht trivial, es kann bis zu 10-15% betragen, schauen Sie sich die Daten an oder probieren Sie es selbst aus. 2) das Niveau der Kompression hat keinen Einfluss auf die Schwierigkeit der Dekompression (siehe stackoverflow.com/questions/28452429/...) - calumbrodie


Wenn Sie eine Website mit hohem Volumen haben und trotzdem eine vollständige Kompressionsstufe (9) haben möchten, ist es am besten, wenn Sie Ihren statischen Inhalt auf Amazon S3 oder ähnliche Objektspeicherdienste stellen und die komprimierten Dateien hochladen.

Sie würden immer noch nginx verwenden, um Ihren HTML-Code zu komprimieren, also sollten Sie diesen Wert auf normal halten, ich verwende dort 5.


0
2018-01-15 21:29



Ich würde gerne Ihren Vorschlag verwenden, aber ich habe derzeit kein comp_level In meiner Konfiguration kann ich nicht sagen, auf welchem ​​Level ich gerade bin. Weißt du, was die Standardwerte sind? Quelle? - Hassan Baig