En iyi nginx sıkıştırma gzip seviyesi nedir?


44

Gzip etkinken nginx reverse proxy cache kullanıyorum. Ancak, Android uygulamaları HTTP-isteklerinden Rails JSON web servisime bazı problemler aldım. Ters proxy önbelleğini kapattığımda, yanıt başlığı gzip olmadan geldiği için düzgün çalışıyor. Bu nedenle, sorunun gzip'ten kaynaklandığını düşünüyorum. En uygun gzip sıkıştırma seviyesi nedir?

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;

Yanıtlar:


18

Gzip sıkıştırma seviyesi basitçe verilerin ne kadar sıkıştırılmış olduğunu 1-9 arasında bir ölçekte belirler, burada 9 en çok sıkıştırılır. Değişim, en sıkıştırılmış verilerin genellikle sıkıştırmak / açmak için en fazla işi gerektirmesidir, bu nedenle yüksek hacimli bir web sitesinde oldukça yüksek bir değere sahipseniz, bunun etkisini hissedebilirsiniz.

Sorunlarınız isteklerinizdeki HTTP başlıklarıyla daha fazla alakalı gibi görünüyor. Genellikle gzip sıkıştırılmış HTTP trafiğine Content-Encoding: gzipbaşlık eşlik eder . Eğer bu bir yere düşürülüyorsa, müşteri cevabı açmak zorunda kalacağını bilemeyebilir.


İstemciden http istek başlığını kullanarak gzip yanıtını nasıl devre dışı bırakabilirim? Kabul-Kodlamayı deniyorum: '', fakat işe yaramıyor.
Chamnap

RFC2616'dan ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Sadece aşağıdakileri kabul etmeden 'Kabul Etme :' istediğinizi düşünüyorum.
büyümek

Evet, boş dize ile Kabul Et Kodlama başlığını mozillada poster addon eklenmiş ve Content-Encoding olmadan yanıtı ekledim: 'gzip'. Ancak, android uygulamasında, her zaman gzip içinde geri döner. Proxy önbellek dizinlerinde nelerin önbellekte saklandığını kontrol ettim, nginx gzip içeriğini önbelleğe aldı, bu yüzden muhtemelen geri gzip'e cevap veriyor. Bu nasıl çözülür?
Chamnap

Bazı kaynaklar, sıkıştırma seviyesi arttıkça, dekompresyon kaynaklarının artmadığını gösterir. Kaynaklar aslında bazı durumlarda sıkıştırma seviyesi arttıkça azalır . stackoverflow.com/questions/28452429/…
user2208096

90

Bunu nginx 1.3.9 altında iki dosya ile test ettim ve bunlar çeşitli seviyeler için elde ettiğim sonuçlardı:


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 (Sıkıştırılmamış):

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)

Bunun ne kadar temsili olduğundan emin değilim ama bunun bir örnek teşkil etmesi gerekiyor. Ayrıca, CPU kullanımını hesaba katmadım, ancak bu sonuçlardan ideal sıkıştırma seviyesi 4ve arasında görünüyor 6.


Ayrıca, gzip_staticmodülü kullanıyorsanız, dosyalarınızı önceden sıkıştırmak isteyebilirsiniz (PHP'de):

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;
}

Bu, her istek üzerine CPU'dan ödün vermeden mümkün olan en iyi sıkıştırmayı elde etmenizi sağlar.


En sonuçlarla bu jibes weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much düzeyinde 5 ve 6 sonra sıkıştırma seviyelerinde kapalı büyük bir düşüş gösterir
Jeff Atwood

6

CPU kaynaklarını gerçekten yedekleyebiliyorsanız 9 kullanabilirsiniz, ancak çoğu site için 2 değeri yeterlidir, çünkü gzip dosyayı seviye 1'den sonra çok fazla azaltmaz.

Düzenleme: Amazon CloudFront'a baktım ve 6. seviyeyi kullanıyor gibiyim, çünkü muhtemelen bu seviye dekompresyon işlemini daha hızlı yapan, böylece sayfa oluşturma performansını artıran seviyedir.


Bu doğru değil
calumbrodie 26:18

2
Cloud, bunun neyin yanlış olduğunu açıklıyor musun? Her neyse, cevabı güncelledim, biraz daha araştırdım ve Amazon CloudFront gibi sitelerin 6 sıkıştırma seviyesini kullandığını gördüm, çünkü muhtemelen dekompresyon hızı konusunda en iyisidir (bu nedenle sayfalar daha hızlı yüklenir).
DiegoG

1) 2 ile 6 arasındaki fark önemsiz değildir,% 10-15'e kadar çıkabilir, verilere bakabilir veya kendiniz deneyebilirsiniz. 2) sıkıştırma seviyesi, açma zorluğunu etkilemez (bkz. Stackoverflow.com/questions/28452429/… )
calumbrodie

0

Yüksek hacimli bir web siteniz varsa ve hala tam bir sıkıştırma düzeyine (9) sahip olmak istiyorsanız, en iyi fikir statik içeriğinizi Amazon S3 veya benzeri nesne depolama hizmetlerine koymak ve sıkıştırılmış dosyaları yüklemek olacaktır.

Hala HTML'nizi sıkıştırmak için nginx kullanmak istersiniz, bu yüzden değeri normalde tutmak için orada 5 kullanıyorum.


Önerinizi kullanmak isterdim, ancak şu anda comp_levelbenim yapılandırmama dahil etmediğim için şu anda hangi seviyede olduğumu söyleyemiyorum. Varsayılanların ne olduğunu biliyor musunuz? Kaynak?
Hassan Baig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.