Tại sao mô-đun giải nén Nginx Gzip không hoạt động?


11

Tôi hiện đang cố gắng thiết lập Nginx để phục vụ tất cả các tệp tĩnh của mình. Vì chúng sẽ không được thay đổi rất thường xuyên, tôi muốn cho chúng tôi mô-đun gzip_static để cho phép tôi sao chép trước các tệp của tệp để tiết kiệm thời gian cpu và cho phép nén tốt hơn.

Tôi đã biên dịch Nginx với --with-http_gzip_static_modulevà thiết lập nó để nó đang phục vụ các tệp tĩnh của tôi, cho đến nay không có vấn đề gì. Tôi muốn kiểm tra và đảm bảo rằng gzipping tĩnh thực sự hoạt động, vì vậy tôi đã tạo hai tệp test.txttest.txt.gz. Dòng đầu tiên của mỗi tệp cho biết liệu chúng có được nén hay không, và sau đó có một dòng mới và 256 ký tự ngẫu nhiên (khác nhau giữa hai tệp).

Tôi đã đọc rằng thời gian sửa đổi của tệp và bản sao được nén của nó phải giống nhau và tôi đã thử cả hai cách sau:

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

Trên máy cục bộ của tôi, tôi đang thử nghiệm với curl:

curl $URL/test.txt

Điều này hoạt động tốt, tôi lấy lại phiên bản mà tôi không nén trước, nhưng khi tôi làm điều này:

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

Tôi cũng lấy lại phiên bản mà tôi đã không giải nén. Tôi cố gắng thiết lập gzip offtrong tôi nginx.conf, nhưng nó không tạo sự khác biệt. Tôi cũng đã biên dịch lại Nginx --without-http_gzip_modulevà điều đó dường như cũng không tạo ra sự khác biệt, Nginx vẫn tự mình điều chỉnh mọi thứ.

Tôi còn khá mới mẻ với Nginx, nhưng tôi thực sự thua lỗ ở đây.

Đây là đầu ra của ./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

Và đây là của tôi 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;
    }
}

Bất kỳ trợ giúp là rất đánh giá cao!

Câu trả lời:


8

Bạn đã không đề cập đến vấn đề này trong câu hỏi của bạn, nhưng tôi có thẩm quyền tốt rằng bạn đang điều hành Nginx ủy nhiệm đằng sau một Nginx khác trên một máy chủ được chia sẻ. ;)

Tại thời điểm tôi viết bài này, các mô-đun gzip của Nginx sử dụng HTTP 1.1 theo mặc định, nhưng Nginx chỉ có thể sử dụng HTTP 1.0 khi liên lạc với các máy chủ phụ trợ, vì vậy giải pháp là đặt gzip_http_versiontrong của bạn nginx.conf, như vậy:

gzip_http_version 1.0;

Khởi động lại Nginx của bạn sau khi thực hiện thay đổi đó và bạn nên kinh doanh.


Kinh ngạc! Làm thế nào bạn biết điều này?
Jürgen Paul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.