Apa level gzip kompresi nginx terbaik?

44

Saya menggunakan cache proxy reverse nginx dengan gzip diaktifkan. Namun, saya mendapat beberapa masalah dari aplikasi Android HTTP-request ke layanan web Rails JSON saya. Tampaknya ketika saya mematikan cache proxy terbalik, berfungsi dengan baik karena header respons datang tanpa gzip. Karena itu, saya pikir masalahnya disebabkan oleh gzip. Apa tingkat kompresi gzip yang paling tepat?

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
sumber

Jawaban:

18

Tingkat kompresi gzip hanya menentukan seberapa kompres data pada skala 1-9, di mana 9 adalah yang paling terkompresi. Imbalannya adalah bahwa data yang paling dikompresi biasanya membutuhkan kerja paling banyak untuk dikompres / dekompresi, jadi jika Anda memilikinya cukup tinggi pada situs web volume tinggi, Anda mungkin merasakan efeknya.

Sepertinya masalah Anda lebih terkait dengan header HTTP pada permintaan. Biasanya traffic HTTP yang dikompresi dengan gzip disertai dengan Content-Encoding: gzipheader. Jika ini dijatuhkan di suatu tempat, maka klien mungkin tidak tahu harus mendekompres responsnya.

menggeram
sumber
Bagaimana cara menonaktifkan respons gzip menggunakan tajuk permintaan http dari klien? Saya mencoba Accept-Encoding: '', tetapi tidak berhasil.
Chamnap
Dari RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Saya pikir Anda hanya ingin 'Terima-Pengkodean:' tanpa diikuti.
growse
Ya, saya menambahkan header Accept-Encoding dengan string kosong dengan addon poster di mozilla, dan responsnya kembali tanpa Content-Encoding: 'gzip'. Namun, pada aplikasi android, ia selalu kembali ke gzip. Saya memeriksa apa yang telah di-cache dalam direktori cache proksi, nginx melakukan cache konten gzip, jadi itu mungkin tanggapan kembali di gzip. Bagaimana cara mengatasinya?
Chamnap
Beberapa sumber menunjukkan bahwa sumber daya dekompresi tidak meningkat ketika tingkat kompresi meningkat. Sumber daya benar-benar menurun dalam beberapa kasus ketika tingkat kompresi meningkat. stackoverflow.com/questions/28452429/…
user2208096
90

Saya menguji ini di bawah nginx 1.3.9 dengan dua file, dan ini adalah hasil yang saya dapatkan untuk berbagai tingkatan:


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 (Tidak terkompresi):

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)

Saya tidak yakin seberapa representatifnya hal ini tetapi harus dijadikan contoh. Juga, saya belum memperhitungkan penggunaan CPU tetapi dari hasil ini tingkat kompresi yang ideal tampaknya antara 4dan 6.


Selain itu, jika Anda menggunakan gzip_staticmodul, Anda mungkin ingin melakukan pra-kompres file Anda (dalam 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;
}

Ini memungkinkan Anda untuk mendapatkan kompresi terbaik tanpa mengorbankan CPU pada setiap permintaan.

Alix Axel
sumber
ini cocok dengan hasil di weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much yang menunjukkan penurunan besar dalam tingkat kompresi setelah level 5 dan 6.
Jeff Atwood
6

Jika Anda benar-benar dapat menghemat sumber daya CPU, Anda dapat menggunakan 9, tetapi untuk sebagian besar situs nilai 2 sudah cukup, karena gzip tidak mengurangi banyak file setelah level 1.

Sunting: Saya melihat Amazon CloudFront dan tampaknya menggunakan level 6, mungkin karena level itu adalah yang menjalankan dekompresi lebih cepat, sehingga meningkatkan kinerja pembuatan halaman.

DiegoG
sumber
Ini tidak benar
calumbrodie
2
Anda bisa menjelaskan apa yang salah tentang itu? Bagaimanapun, saya memperbarui jawabannya, saya meneliti sedikit lebih banyak dan saya melihat bahwa situs-situs seperti Amazon CloudFront menggunakan tingkat kompresi 6, mungkin karena itu yang terbaik tentang kecepatan dekompresi (sehingga halaman akan memuat lebih cepat).
DiegoG
1) Perbedaan antara 2 dan 6 tidak sepele, bisa hingga 10-15%, lihat data atau coba sendiri. 2) tingkat kompresi tidak memengaruhi kesulitan dekompresi (lihat stackoverflow.com/questions/28452429/… )
calumbrodie
0

Jika Anda memiliki situs web bervolume tinggi dan masih ingin memiliki tingkat penuh (9) kompresi, ide terbaik adalah menempatkan konten statis Anda di Amazon S3 atau layanan penyimpanan objek serupa dan mengunggah file terkompresi.

Anda masih ingin menggunakan nginx untuk mengompresi HTML Anda, jadi lebih baik untuk menjaga nilai itu tetap normal, saya menggunakan 5 di sana.

Aftab Naveed
sumber
Saya ingin menggunakan saran Anda, tetapi saat ini saya belum memasukkan a comp_leveldi konfigurasi saya, jadi saya tidak bisa mengatakan pada level apa saya saat ini. Apakah Anda tahu apa standarnya? Sumber?
Hassan Baig