Was ist die beste Nginx-Komprimierungs-GZIP-Stufe?

44

Ich verwende den Nginx-Reverse-Proxy-Cache mit aktiviertem gzip. Ich habe jedoch einige Probleme aufgrund von HTTP-Anfragen von Android-Anwendungen an meinen Rails JSON-Webdienst. Wenn ich den Reverse-Proxy-Cache ausschalte, funktioniert er anscheinend in Ordnung, da der Antwortheader ohne gzip geliefert wird. Daher denke ich, dass das Problem durch gzip verursacht wird. Was ist die am besten geeignete Stufe 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;
Chamnap
quelle

Antworten:

18

Die Stufe der gzip-Komprimierung bestimmt einfach, wie komprimiert die Daten auf einer Skala von 1 bis 9 sind, wobei 9 die am stärksten komprimierte ist. Der Nachteil ist, dass die am meisten komprimierten Daten in der Regel die meiste Arbeit zum Komprimieren / Dekomprimieren erfordern. Wenn Sie sie also auf einer Website mit hohem Volumen ziemlich hoch eingestellt haben, spüren Sie möglicherweise den Effekt.

Es scheint, dass Ihre Probleme eher mit den HTTP-Headern in den Anforderungen zusammenhängen. Normalerweise wird gzip-komprimierter HTTP-Datenverkehr vom Content-Encoding: gzipHeader begleitet. Wenn dies irgendwo gelöscht wird, weiß der Client möglicherweise nicht, dass er die Antwort dekomprimieren muss.

wachsen
quelle
Wie deaktiviere ich die gzip-Antwort über den HTTP-Anforderungsheader des Clients? Ich versuche Accept-Encoding: '', aber es funktioniert nicht.
Chamnap
Aus RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Ich denke, Sie möchten nur 'Accept-Encoding:' mit nichts Folgendem.
wachsen
Ja, ich habe den Header Accept-Encoding mit leerem String mit Poster-Addon auf Mozilla hinzugefügt und die Antwort ohne Content-Encoding zurück: 'gzip'. In der Android-App kehrt es jedoch immer wieder in gzip zurück. Ich habe überprüft, was in den Proxy-Cache-Verzeichnissen zwischengespeichert wurde, und nginx hat den gzip-Inhalt zwischengespeichert, sodass es sich wahrscheinlich um Antworten in gzip handelt. Wie kann man das lösen?
Chamnap
Einige Quellen schlagen vor, dass die Dekomprimierungsressourcen nicht mit zunehmender Komprimierungsstufe zunehmen. In einigen Fällen verringern sich die Ressourcen tatsächlich, wenn die Komprimierungsstufe zunimmt. stackoverflow.com/questions/28452429/…
user2208096
90

Ich habe dies unter Nginx 1.3.9 mit zwei Dateien getestet, und dies 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 (nicht komprimiert):

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 nicht sicher, wie repräsentativ dies ist, aber es sollte als Beispiel dienen. Ich habe auch die CPU-Auslastung nicht berücksichtigt, aber aus diesen Ergebnissen scheint die ideale Komprimierungsstufe zwischen 4und zu liegen 6.


Wenn Sie das gzip_staticModul verwenden, möchten Sie möglicherweise 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;
}

Auf diese Weise können Sie die bestmögliche Komprimierung erzielen, ohne bei jeder Anforderung die CPU zu belasten.

Alix Axel
quelle
Dies stimmt mit den Ergebnissen auf weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much überein, die einen starken Rückgang der Komprimierungsstufen nach Stufe 5 und 6 anzeigen .
Jeff Atwood
6

Wenn Sie wirklich CPU-Ressourcen sparen können, können Sie 9 verwenden, aber für die meisten Sites ist ein Wert von 2 ausreichend, da gzip die Datei nach Stufe 1 nicht wesentlich verkleinert.

Bearbeiten: Ich habe mir Amazon CloudFront angesehen und es scheint, als würde es Level 6 verwenden, wahrscheinlich weil dieses Level die Dekomprimierung beschleunigt und somit die Leistung beim Rendern von Seiten verbessert.

DiegoG
quelle
Das ist nicht richtig
calumbrodie
2
Cloud du erklärst was daran falsch ist? Wie auch immer, ich habe die Antwort aktualisiert, ein bisschen mehr recherchiert und festgestellt, dass Websites wie Amazon CloudFront eine Komprimierungsstufe von 6 verwenden, wahrscheinlich, weil es am besten um die Dekomprimierungsgeschwindigkeit geht (daher werden Seiten schneller geladen).
DiegoG
1) Der Unterschied zwischen 2 und 6 ist nicht trivial, er kann bis zu 10-15% betragen, sich die Daten ansehen oder es selbst versuchen. 2) Die Komprimierungsstufe hat keinen Einfluss auf die Schwierigkeit des Dekomprimierens (siehe stackoverflow.com/questions/28452429/… )
calumbrodie
0

Wenn Sie eine Website mit hohem Volumen haben und dennoch eine vollständige Komprimierungsstufe (9) wünschen, ist es am besten, Ihren statischen Inhalt auf Amazon S3 oder ähnliche Objektspeicherdienste zu stellen und die komprimierten Dateien hochzuladen.

Sie möchten immer noch nginx verwenden, um Ihr HTML zu komprimieren. Um diesen Wert also auf dem normalen Wert zu halten, verwende ich dort 5.

Aftab Naveed
quelle
Ich würde gerne Ihren Vorschlag verwenden, habe aber noch keinen comp_levelin meine Konfiguration aufgenommen, sodass ich nicht sagen kann, auf welchem ​​Level ich mich gerade befinde. Wissen Sie, wie die Standardeinstellungen lauten? Quelle?
Hassan Baig