2008-09-16 19 views
34

Tôi đang phân phối tất cả nội dung thông qua apache với Content-Encoding: zip nhưng điều đó sẽ bị nén khi đang di chuyển. Một lượng lớn nội dung của tôi là các tệp tĩnh trên đĩa. Tôi muốn gzip các tập tin trước thay vì nén chúng mỗi khi chúng được yêu cầu.Làm cách nào để tôi có thể nén trước các tệp bằng mod_deflate trong Apache 2.x?

Đây là điều mà tôi tin rằng, mod_gzip đã làm trong Apache 1.x tự động, nhưng chỉ có tệp có .gz bên cạnh nó. Đó không còn là trường hợp với mod_deflate.

+0

Tôi không nghĩ rằng bạn sẽ tiết kiệm được nhiều tiền; với các máy chủ web hiện đại, chi phí nén nội dung trên bay là không đáng kể. – Aeon

+2

Tôi đang chạy máy chủ web trong máy ảo Xen vì vậy tôi muốn tiết kiệm càng nhiều CPU càng tốt cho các máy ảo khác. Ngoài ra tôi đã có thể tăng gấp đôi tốc độ yêu cầu được đo bằng httperf trên một tệp 55k được nén trước khi nén khi đang di chuyển. – Otto

+0

Xem http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files?lq=1 –

Trả lời

13

Chức năng này đã bị thất lạc trong mod_gzip. Trong Apache 2.x, you do that with content negotiation. Cụ thể, bạn cần bật MultiViews với số Options directive và bạn cần chỉ định loại mã hóa của mình với AddEncoding directive.

+0

http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files?lq=1 –

0

Bạn có thể sử dụng mod_cache để proxy nội dung cục bộ trong bộ nhớ hoặc trên đĩa. Tôi không biết nếu điều này sẽ làm việc như mong đợi với mod_deflate.

1

nội dung nén mod_gzip đang hoạt động. Bạn có thể nén trước các tệp bằng cách thực sự đăng nhập vào máy chủ của bạn và thực hiện nó từ trình bao.

cd /var/www/.../data/ 
for file in *; do 
    gzip -c $file > $file.gz; 
done; 
+0

Điều này sẽ loại bỏ các tập tin ban đầu, có nghĩa là khách hàng không có Aceept-Encoding: gzip sẽ không được phục vụ. – Otto

+0

điểm tốt, được cập nhật. – Aeon

+0

Trong khi bạn đang chỉnh sửa, tại sao không thêm -9 và có thể nén cao nhất có thể. 1500 tệp của tôi được nén trong 38 giây, do đó, bạn nên lưu mọi byte có thể trong băng thông và thời gian tải xuống. :) (Ngoài ra tôi cũng có thể chỉnh sửa lỗi đánh máy của mình trong nhận xét trước đó của mình.) Dù sao, – Otto

8

Để trả lời câu hỏi của riêng tôi với dòng thực sự đơn giản, tôi đã mất tích trong confiuration tôi:

Options FollowSymLinks MultiViews 

tôi nhớ da diết tùy chọn MultiViews. Nó có trong cấu hình máy chủ web mặc định của Ubuntu, vì vậy đừng như tôi và thả nó đi.

Ngoài ra, tôi đã viết tác vụ Rake nhanh để nén tất cả các tệp.

namespace :static do 
    desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly." 
    task :compress do 
     puts "Gzipping js, html and css files." 
     Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file| 
      system "gzip -c -9 #{file} > #{file}.gz" 
     end 
    end 
end 
4

Tôi có một Apache 2 được xây dựng từ nguồn, và tôi thấy tôi đã phải sửa đổi như sau trong httpd.conf của tôi file:

Thêm MultiViews Options:

Options Indexes FollowSymLinks MultiViews 

Uncomment AddEncoding:

AddEncoding x-compress .Z 
AddEncoding x-gzip .gz .tgz 

Bình luận AddType:

#AddType application/x-compress .Z 
#AddType application/x-gzip .gz .tgz 
4

Tôi MultiViews sợ sẽ không làm việc như mong đợi: doc nói MultiViews hoạt động "nếu máy chủ nhận được yêu cầu/some/dir/foo , nếu/some/dir đã bật MultiViews và/some/dir/foo không tồn tại ... ", nói cách khác: nếu bạn có tệp foo.js và foo.js.gz trong cùng một thư mục, chỉ cần kích hoạt MultiViews sẽ không khiến tệp .gz được gửi ngay cả khi tiêu đề gzip AcceptEncoding được truyền bởi trình duyệt (bạn có thể xác minh hành vi này bằng cách tạm thời vô hiệu hóa mod_deflate và theo dõi phản hồi với ví dụ: HTTPFox).

Tôi không chắc liệu có cách nào xung quanh vấn đề này với MultiViews (có thể bạn đổi tên tệp gốc và sau đó thêm chỉ thị AddEncoding đặc biệt), nhưng tôi tin rằng bạn có thể xây dựng quy tắc mod_rewrite để xử lý.

+0

Tôi chắc chắn rằng nó hoạt động vào thời điểm đó và tôi chắc chắn rằng tôi đã không xóa các tệp gốc. Đó là mod_rewrite đáng tin cậy đã được tham gia, bằng cách nào đó. Tôi có thể đã có một quy tắc được "phục vụ này tĩnh nếu tập tin tồn tại". Tôi có thể đã thay đổi nó để bao gồm.gz mở rộng, nhưng tôi không còn có quyền truy cập vào hệ thống đó để xác minh. – Otto

+0

Nếu trong ví dụ của bạn, bạn chỉ yêu cầu foo thay vì foo.js, nó sẽ hoạt động. Nếu khách hàng chấp nhận gzip, họ sẽ nhận foo.js.gz nếu không họ sẽ nhận foo.js. –

+1

xem http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files?lq=1 –

0

Tôi có rất nhiều tệp .json lớn. Hầu hết độc giả đều ở trong tình huống này. Các câu trả lời xem trước không nói về "Kiểu nội dung" được trả về.

tôi bạn muốn yêu cầu sau đây trả về một tập tin trước khi nén với "Content-Type: application/json" minh bạch, sử dụng MultiView với ForceType

http://www.domain.com/(...)/bigfile.json 
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip 

1) tập tin phải được đổi tên: "file.ext .ext"

2) MultiView hoạt động tốt với ForceType

Trong hệ thống file:

// Note there is no bigfile.json 
(...)/bigfile.json.gz 
(...)/bigfile.json.json 

Trong cấu hình apache của bạn:

<Directory (...)> 
    AddEncoding gzip .gz 
    Options +Multiviews 
    <Files *.json.gz> 
     ForceType application/json 
    </Files> 
</Directory> 

ngắn và đơn giản :)

3

Có thể phục vụ các tập trước nén sử dụng mod_negotiation mặc dù nó là một chút khó tính. Khó khăn chính là only requests for files which do not exist are negotiated. Vì vậy, nếu foo.jsfoo.js.gz cả hai tồn tại, các câu trả lời cho /foo.js sẽ luôn không được nén (mặc dù câu trả lời cho /foo sẽ hoạt động chính xác).

Giải pháp dễ nhất tôi đã tìm thấy (from François Marier) là để đổi tên file nén có phần mở rộng tập tin đôi, vì vậy foo.js được triển khai như foo.js.js có yêu cầu cho /foo.js đàm phán giữa foo.js.js (không mã hóa) và foo.js.gz (mã hóa gzip).

tôi kết hợp lừa rằng với cấu hình sau:

Options +MultiViews 
RemoveType .gz 
AddEncoding gzip .gz 

# Send .tar.gz without Content-Encoding: gzip 
<FilesMatch ".+\.tar\.gz$"> 
    RemoveEncoding .gz 
    # Note: Can use application/x-gzip for backwards-compatibility 
    AddType application/gzip .gz 
</FilesMatch> 

tôi wrote a post mà thảo luận về lý luận cho cấu hình này và một số lựa chọn thay thế một cách chi tiết.

+0

Rất tốt. – Otto

+0

Điều này dường như không hoạt động nữa. Với Apache 2.4.25 tôi luôn nhận được kết quả không nén, có lẽ vì MultiViews chỉ khởi động nếu tệp không tồn tại như được đặt tên. Tài liệu nói nhiều. Lòng thương hại! – MvG

+0

Bắt tốt @MvG, bạn hoàn toàn đúng! Tôi đã cập nhật các câu trả lời với một workaround, mặc dù nó không phải là lý tưởng vì nó đòi hỏi phải đổi tên các tập tin không nén và một chút trickery cấu hình. Hy vọng nó giúp! – Kevinoid

Các vấn đề liên quan