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


Gzip etkinken nginx ters proxy önbellek kullanıyorum. Ancak, Android uygulamaları HTTP isteklerinden Rails JSON web servisime bazı problemlerim var. Ters proxy önbelleği kapattığımda, yanıt başlığının gzip içermediği için işe yarıyor gibi görünüyor. Bu yüzden problemin 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;

37
2018-03-29 09:14


Menşei




Cevaplar:


Gzip sıkıştırmanın seviyesi, verilerin sıkıştırılmasının, 9'un en sıkıştırılmış olduğu 1-9 arası bir ölçekte nasıl oluşturulduğunu belirler. En çok sıkıştırılan veri genellikle sıkıştırmak / sıkıştırmak için en fazla çalışma gerektirdiğinden, bu yüzden yüksek hacimli bir web sitesinde oldukça yüksek bir değer oluşturduysanız, etkisini hissedebilirsiniz.

Sorunlarınızın, isteklerdeki HTTP başlıklarıyla daha alakalı olduğu anlaşılıyor. Genellikle gzip sıkıştırılmış HTTP trafiğine eşlik eder. Content-Encoding: gzip başlığı. Bu bir yere düşürüldüğünde, istemci yanıtı sıkıştırmak zorunda kalmayabilir.


15
2018-03-29 09:22



İstemciden http isteği üstbilgisini kullanarak gzip yanıtı nasıl devre dışı bırakılır? Accept-Encoding'i deniyorum: '' ama işe yaramıyor. - Chamnap
RFC2616'dan (w3.org/Protocols/rfc2616/rfc2616-sec14.html) Sanırım hiçbir şey takip etmeden sadece 'Accept-Encoding:' istediğini düşünüyorum. - growse
Evet, Accept-Encoding başlığını mozillada poster addon ile boş bir dize ve Content-Encoding: 'gzip' olmaksızın yanıtı ekledim. Ancak, android uygulamasında, her zaman gzip içinde geri döner. Proxy önbellek dizinlerinde önbelleğe alınanları kontrol ettim, nginx gzip içeriğini önbelleğe alıyor, bu yüzden muhtemelen gzip uygulamasında yanıtlar veriyor. Bunu nasıl çözebilirim? - Chamnap
Bazı kaynaklar, sıkıştırma seviyesi arttıkça dekompresyon kaynaklarının artmadığını ileri sürmektedir. Kaynaklar aslında azaltmak bazı durumlarda sıkıştırma seviyesi artar. stackoverflow.com/questions/28452429/... - user2208096


Bunu nginx 1.3.9 altında iki dosyayla 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 nasıl bir temsilci olduğundan emin değilim ama örnek olarak hizmet etmeli. Ayrıca, CPU kullanımını hesaba katmadım ama bu sonuçlardan ideal sıkıştırma seviyesi 4 ve 6.


Ayrıca, gzip_static Modül, 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 istekte CPU'dan ödün vermeden mümkün olan en iyi sıkıştırmayı elde etmenizi sağlar.


77
2017-11-27 16:15



sonuçlarla bu jibes weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much Bu da seviye 5 ve 6'dan sonra sıkıştırma seviyelerinde büyük bir düşüş olduğunu göstermektedir. - Jeff Atwood


Eğer gerçekten CPU kaynaklarını boşaltabilirsiniz, 9 kullanabilirsiniz, ancak çoğu site için 2 değeri yeterlidir, çünkü gzip dosyayı 1. seviyeden sonra çok azaltmaz.

Düzenle: Amazon CloudFront'a baktım ve seviye 6 kullanıyor gibi görünüyor, çünkü muhtemelen bu seviye dekompresyonun daha hızlı çalıştığı ve böylelikle sayfa oluşturma performansını geliştirdiği için.


6
2018-05-09 11:11



Bu doğru değil - calumbrodie
Cloud, bunun nesi yanlış olduğunu açıklıyor musun? Her neyse, cevabı güncelledim, biraz daha araştırdım ve Amazon CloudFront gibi sitelerin 6'lık bir sıkıştırma seviyesi kullandığını görüyorum, çünkü muhtemelen dekompresyon hızıyla ilgili en iyisi (sayfalar daha hızlı yüklenecek). - DiegoG
1) 2 ve 6 arasındaki fark önemsizdir,% 10-15'e kadar çıkabilir, verilere bakın veya kendiniz deneyin. 2) sıkıştırma seviyesi, sıkıştırmanın zorluğunu etkilemez (bkz. stackoverflow.com/questions/28452429/...) - calumbrodie


Yüksek hacimli web siteniz varsa ve yine de tam bir sıkıştırma (9) seviyesine 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.

HTML'nizi sıkıştırmak için nginx'i kullanmak isteyebilirsiniz, bu değeri normal tutmak için daha iyi, 5 tane orada kullanıyorum.


0
2018-01-15 21:29



Önerinizi kullanmak istiyorum ancak şu anda bir comp_level Benim yapılandırmamda, şu anda hangi seviyede olduğumu anlayamıyorum. Varsayılanların ne olduğunu biliyor musun? Kaynak? - Hassan Baig