ระดับการบีบอัด nginx ที่ดีที่สุดคืออะไร?


44

ฉันใช้แคชพร็อกซีย้อนกลับของ nginx เมื่อเปิดใช้งาน gzip อย่างไรก็ตามฉันมีปัญหาบางอย่างจากแอพพลิเคชั่น Android HTTP-ร้องขอไปยังบริการเว็บ Rails JSON ของฉัน ดูเหมือนว่าเมื่อฉันปิดแคชพร็อกซีย้อนกลับมันก็ใช้ได้เพราะส่วนหัวการตอบสนองมาโดยไม่ต้อง gzip ดังนั้นฉันคิดว่าปัญหาเกิดจาก gzip ระดับการบีบอัด gzip ที่เหมาะสมที่สุดคืออะไร?

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;

คำตอบ:


18

ระดับของการบีบอัด gzip เพียงแค่กำหนดว่าการบีบอัดข้อมูลอยู่ในระดับใดตั้งแต่ 1-9 โดยที่ 9 เป็นการบีบอัดที่มากที่สุด ข้อดีคือข้อมูลที่ถูกบีบอัดส่วนใหญ่ต้องการงานบีบอัด / คลายการบีบอัดมากที่สุดดังนั้นหากคุณตั้งค่าไว้ค่อนข้างสูงในเว็บไซต์ที่มีปริมาณมากคุณอาจรู้สึกถึงผลกระทบที่เกิดขึ้น

ดูเหมือนว่าปัญหาของคุณเกี่ยวข้องกับส่วนหัว HTTP ของคำขอมากขึ้น โดยปกติทราฟฟิก HTTP ที่ถูกบีบอัด gzip จะมาพร้อมกับContent-Encoding: gzipส่วนหัว ถ้าสิ่งนี้กำลังถูกดร็อปที่ใดที่หนึ่งไคลเอ็นต์อาจไม่รู้ว่าต้องคลายการตอบสนอง


วิธีปิดใช้งานการตอบสนอง gzip โดยใช้ส่วนหัวคำขอ http จากลูกค้า? ฉันลองยอมรับการเข้ารหัส: '' แต่ใช้ไม่ได้
Chamnap

จาก RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) ฉันคิดว่าคุณต้องการเพียง 'ยอมรับการเข้ารหัส:' โดยไม่ต้องทำอะไรเลย
Growse

ใช่ฉันเพิ่มส่วนหัวยอมรับการเข้ารหัสด้วยสตริงว่างด้วย addon โปสเตอร์บน Mozilla และการตอบกลับโดยไม่ต้องเข้ารหัสเนื้อหา: 'gzip' อย่างไรก็ตามในแอพ android มันจะกลับมาเป็น gzip เสมอ ฉันตรวจสอบสิ่งที่แคชในไดเรกทอรีแคชพร็อกซี nginx แคชเนื้อหา gzip ดังนั้นจึงอาจตอบกลับใน gzip วิธีแก้ปัญหานี้
Chamnap

บางแหล่งแนะนำว่าทรัพยากรการบีบอัดไม่เพิ่มขึ้นเมื่อระดับการบีบอัดเพิ่มขึ้น ทรัพยากรลดลงจริง ๆในบางกรณีเมื่อระดับการบีบอัดเพิ่มขึ้น stackoverflow.com/questions/28452429/…
user2208096

90

ฉันทดสอบสิ่งนี้ภายใต้ nginx 1.3.9 ด้วยสองไฟล์และนี่คือผลลัพธ์ที่ฉันได้รับในระดับต่างๆ:


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 (ไม่บีบอัด):

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)

ฉันไม่แน่ใจว่าตัวแทนนี้เป็นอย่างไร แต่ควรทำหน้าที่เป็นตัวอย่าง นอกจากนี้ผมยังไม่ได้ใช้งาน CPU เข้าบัญชี แต่จากผลเหล่านี้ระดับการบีบอัดที่เหมาะน่าจะเป็นระหว่างและ46


นอกจากนี้หากคุณใช้gzip_staticโมดูลคุณอาจต้องการบีบอัดไฟล์ล่วงหน้า (ใน 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;
}

สิ่งนี้ช่วยให้คุณได้รับการบีบอัดที่ดีที่สุดโดยไม่ต้องเสียสละซีพียูในทุก ๆ การร้องขอ


jibes นี้พร้อมผลลัพธ์ที่weblogs.asp.net/owscott/iis-7-compression-good-bad-how-muchซึ่งแสดงการลดลงครั้งใหญ่ในระดับการบีบอัดหลังจากระดับ 5 และ 6
Jeff Atwood

6

หากคุณสามารถจัดสรรทรัพยากร CPU ได้จริงๆคุณสามารถใช้ 9 แต่สำหรับไซต์ส่วนใหญ่ค่า 2 ก็เพียงพอเนื่องจาก gzip ไม่ลดไฟล์มากหลังจากระดับ 1

แก้ไข:ฉันดูที่ Amazon CloudFront และดูเหมือนว่าจะใช้ระดับ 6 อาจเป็นเพราะระดับนั้นเป็นระดับที่บีบอัดข้อมูลได้เร็วขึ้นดังนั้นจึงปรับปรุงประสิทธิภาพการแสดงผลหน้าเว็บ


สิ่งนี้ไม่ถูกต้อง
calumbrodie

2
คลาวด์คุณอธิบายว่าเกิดอะไรขึ้น? อย่างไรก็ตามฉันได้ทำการปรับปรุงคำตอบฉันค้นคว้าเพิ่มเติมอีกเล็กน้อยและฉันเห็นว่าเว็บไซต์อย่าง Amazon CloudFront ใช้ระดับการบีบอัดที่ 6 อาจเป็นเพราะมันเป็นการดีที่สุดเกี่ยวกับความเร็วในการบีบอัด (ดังนั้นหน้าจะโหลดเร็วขึ้น)
DiegoG

1) ความแตกต่างระหว่าง 2 และ 6 นั้นไม่สำคัญมันสามารถทำได้มากถึง 10-15% ดูข้อมูลหรือลองด้วยตัวคุณเอง 2) ระดับของการบีบอัดไม่มีผลกระทบต่อความยากในการขยาย (ดูstackoverflow.com/questions/28452429/… )
calumbrodie

0

หากคุณมีเว็บไซต์ที่มีปริมาณมากและยังต้องการบีบอัดเต็มระดับ (9) ความคิดที่ดีที่สุดคือการวางเนื้อหาแบบคงที่ของคุณใน Amazon S3 หรือบริการจัดเก็บวัตถุที่คล้ายกันและอัปโหลดไฟล์บีบอัด

คุณยังคงต้องการใช้ nginx เพื่อบีบอัด HTML ของคุณดังนั้นเพื่อให้ค่านั้นเป็นปกติฉันควรใช้ 5 ที่นั่น


ฉันต้องการใช้คำแนะนำของคุณ แต่ตอนนี้ฉันยังไม่ได้รวมอยู่comp_levelในการกำหนดค่าของฉันดังนั้นฉันไม่สามารถบอกได้ว่าฉันอยู่ในระดับใด คุณรู้หรือไม่ว่าค่าเริ่มต้นคืออะไร? แหล่งที่มา?
Hassan Baig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.