ทำไมโมดูล Precompression ของ Nginx Gzip จึงไม่ทำงาน


11

ขณะนี้ฉันกำลังพยายามตั้งค่า Nginx เพื่อให้บริการไฟล์คงที่ทั้งหมดของฉัน เนื่องจากพวกเขาจะไม่ถูกเปลี่ยนแปลงบ่อยมากเลยฉันต้องการให้เราโมดูล gzip_static เพื่อให้ฉันสามารถคัดลอกไฟล์ gzip ล่วงหน้าเพื่อประหยัดเวลาของซีพียูและให้การบีบอัดที่ดีขึ้น

ฉันรวบรวม Nginx ด้วย--with-http_gzip_static_moduleและตั้งค่าเพื่อให้บริการไฟล์สแตติกของฉันโดยไม่มีปัญหา ฉันต้องการที่จะทดสอบและตรวจสอบให้แน่ใจว่า gzipping คงเป็นจริงการทำงานดังนั้นฉันทำสองไฟล์และtest.txt test.txt.gzบรรทัดแรกของแต่ละไฟล์บอกว่าพวกเขาเป็น gzipped หรือไม่แล้วมีบรรทัดใหม่และอักขระสุ่ม 256 ตัว (แตกต่างกันระหว่างสองไฟล์)

ฉันได้อ่านว่าเวลาในการแก้ไขไฟล์และไฟล์ gzipped ควรเท่ากันและฉันได้ลองทั้งสองอย่างต่อไปนี้:

touch test.*
touch -r test.txt test.txt.gx

บนเครื่องของฉันฉันกำลังทดสอบกับขด:

curl $URL/test.txt

ใช้งานได้ดีฉันกลับเวอร์ชันที่ฉันไม่ได้บีบอัดไว้ล่วงหน้า แต่เมื่อฉันทำสิ่งนี้:

curl -H "Accept-Encoding: gzip" $URL/test.txt | gunzip

ฉันยังได้รับกลับมารุ่นผมไม่ได้ precompress ฉันลองตั้งค่าgzip offของฉันnginx.confแต่ก็ไม่ได้สร้างความแตกต่าง ฉันได้รวบรวม Nginx อีกครั้งด้วย--without-http_gzip_moduleและดูเหมือนว่าจะไม่สร้างความแตกต่างเช่นกัน Nginx ยังคงเก็บสิ่งต่าง ๆ ไว้ในทันที

ฉันค่อนข้างใหม่กับ Nginx แต่ฉันกำลังขาดทุนอยู่ที่นี่

นี่คือผลลัพธ์ของ ./nginx -V

built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 
configure arguments: --sbin-path=$SOMEPATH/nginx --prefix=$SOMEPATH --user=$ME --group=$MYGROUP --with-http_gzip_static_module --without-http_gzip_module

และนี่คือของฉัน nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
error_log  logs/error.log;
pid        logs/nginx.pid;
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    gzip_static on;
    sendfile        on;
    keepalive_timeout  65;
    access_log  logs/access.log;
    server {
        listen       XXXX;
        server_name  foo.bar.com;
        location / {
            root   html;
        }
        error_page  404 404.html;
        error_page   500 502 503 504 50x.html;
    }
}

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก!

คำตอบ:


8

คุณไม่ได้พูดถึงเรื่องนี้ในคำถามของคุณ แต่ฉันมีสิทธิ์ที่ดีที่คุณใช้ Nginx พร็อกซีที่อยู่เบื้องหลัง Nginx อื่นบนโฮสต์ที่ใช้ร่วมกัน ;)

ในขณะที่ผมเขียนนี้ Nginx โมดูล gzip ใช้ HTTP 1.1 โดยเริ่มต้น แต่ Nginx สามารถใช้ HTTP 1.0 เมื่อการติดต่อสื่อสารกับเซิร์ฟเวอร์ back-end เพื่อแก้ปัญหาคือการตั้งค่าgzip_http_versionในของคุณnginx.confเช่นดังนั้น:

gzip_http_version 1.0;

รีสตาร์ท Nginx ของคุณหลังจากทำการเปลี่ยนแปลงและคุณควรจะทำธุรกิจ


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