2008-09-16 13 views
34

मैं Content-Encoding: zip के साथ अपाचे के माध्यम से सभी सामग्री की सेवा कर रहा हूं लेकिन यह फ्लाई पर संपीड़ित करता है। मेरी सामग्री की एक अच्छी मात्रा डिस्क पर स्थिर फाइलें हैं। मैं हर बार अनुरोध किए जाने पर उन्हें संपीड़ित करने के बजाय फ़ाइलों को पहले से gzip करना चाहता हूं।अपाचे 2.x में mod_deflate के साथ फ़ाइलों को पूर्व-संपीड़ित कैसे कर सकता हूं?

यह मेरा मानना ​​है कि, mod_gzip स्वचालित रूप से अपाचे 1.x में किया गया था, लेकिन इसके पास फ़ाइल के साथ .gz के साथ फ़ाइल है। यह अब mod_deflate के साथ मामला नहीं है।

+0

मुझे नहीं लगता कि आप बहुत बचत करने जा रहे हैं; आधुनिक वेब सर्वर के साथ, फ्लाई पर सामग्री को संपीड़ित करने की लागत नगण्य है। – Aeon

+2

मैं एक ज़ेन वीएम में वेब सर्वर चला रहा हूं इसलिए मैं अन्य वीएम के लिए जितना संभव हो उतना सीपीयू संरक्षित करना चाहता हूं। इसके अलावा मैं फ्लाई पर संपीड़न की तुलना में प्री-संपीड़ित 55k फ़ाइल पर httperf के साथ मापा अनुरोध दर को दोगुना करने में सक्षम था। – Otto

+0

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

उत्तर

13

इस कार्यक्षमता को mod_gzip में किसी भी तरह से गलत स्थानांतरित किया गया था। अपाचे 2.x, you do that with content negotiation में। विशेष रूप से, आपको MultiViews को Options directive के साथ सक्षम करने की आवश्यकता है और आपको 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

आप मेमोरी या डिस्क में स्थानीय सामग्री को प्रॉक्सी करने के लिए mod_cache का उपयोग कर सकते हैं। मुझे नहीं पता कि यह mod_deflate के साथ अपेक्षित काम करेगा या नहीं।

1

फ्लाई पर संपीड़ित सामग्री mod_gzip भी। आप वास्तव में अपने सर्वर में लॉग इन करके और खोल से इसे कर कर फ़ाइलों को पूर्व-संपीड़ित कर सकते हैं।

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

यह इच्छा मूल फ़ाइलों को हटा दें, जिसका अर्थ है क्लाइंट जिनके पास एसेप्ट-एन्कोडिंग नहीं है: gzip को सर्विस नहीं किया जाएगा। – Otto

+0

अच्छा बिंदु, अद्यतन। – Aeon

+0

जब आप संपादन कर रहे हों, तो ऐड -9 क्यों न करें और उच्चतम संपीड़न संभव न हो। मेरी 1500 फाइलें 38 सेकेंड में संपीड़ित हैं, इसलिए बैंडविड्थ में हर बाइट को संभव बनाने और डाउनलोड करने के लिए संभव है। :) (यह भी चाहता है कि मैं अपनी पिछली टिप्पणी में अपना टाइपो संपादित कर सकूं। यूघ) – Otto

8

वास्तव में सरल रेखा मैं अपने confiuration में याद आ रही थी के साथ अपने ही सवाल का जवाब करने के लिए:

Options FollowSymLinks MultiViews 

मैं MultiViews विकल्प याद आ रही थी। यह उबंटू डिफ़ॉल्ट वेब सर्वर कॉन्फ़िगरेशन में है, इसलिए मेरे जैसा मत बनो और इसे छोड़ दें।

इसके अलावा मैंने सभी फ़ाइलों को संपीड़ित करने के लिए त्वरित रेक कार्य लिखा था।

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

मैं एक अपाचे 2 स्रोत से बनाया है, और मैंने पाया मैं फ़ाइल मेरी httpd.conf में निम्न संशोधन करना पड़ा:

विकल्प MultiViews जोड़ें:

Options Indexes FollowSymLinks MultiViews 

असुविधा AddEncoding:

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

टिप्पणी AddType:

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

मैं कर रहा हूँ डर MultiViews अपेक्षा के अनुरूप काम नहीं करेगा: डॉक Multiviews काम करता है "का कहना है कि अगर सर्वर के लिए/कुछ/dir/foo एक अनुरोध प्राप्त करता है , अगर/कुछ/डीआईआर में मल्टीव्यू सक्षम हैं, और/कुछ/dir/foo मौजूद नहीं है ... ", दूसरे शब्दों में: यदि आपके पास एक ही निर्देशिका में foo.js और foo.js.gz फ़ाइल है, तो बस सक्रिय मल्टीव्यूज़ .gz फ़ाइल को तब तक नहीं भेजेगा जब भी AcceptEncoding gzip शीर्षलेख ब्राउज़र द्वारा प्रेषित किया जाता है (आप इस व्यवहार को सत्यापित कर सकते हैं अस्थायी रूप से mod_deflate को अक्षम करके और प्रतिक्रिया के साथ प्रतिक्रिया की निगरानी करके HTTPFox)।

मैं अगर वहाँ (शायद आप मूल फ़ाइल का नाम बदलने और फिर एक विशेष AddEncoding निर्देश जोड़ सकते हैं) MultiViews के साथ इस के चारों ओर एक रास्ता है यकीन नहीं है, लेकिन मेरा मानना ​​है कि आप एक mod_rewrite नियम इस संभाल करने के लिए निर्माण कर सकते हैं।

+0

मुझे यकीन है कि यह उस समय काम करता था, और मुझे यकीन है कि मैंने मूल फ़ाइलों को हटाया नहीं है। यह व्यवहार्य mod_rewrite शामिल था, किसी भी तरह। मेरे पास शायद एक नियम था जो "फ़ाइल मौजूद है, तो यह स्थिर रूप से सेवा करें"। मैंने इसे शामिल करने के लिए इसे बदल दिया होगा।gz एक्सटेंशन, लेकिन अब मुझे सत्यापित करने के लिए उस सिस्टम तक पहुंच नहीं है। – Otto

+0

यदि आपके उदाहरण में आप foo.js की बजाय केवल foo का अनुरोध करते हैं, तो यह काम करेगा। यदि ग्राहक gzip स्वीकार करता है तो उन्हें foo.js.gz मिल जाएगा अन्यथा उन्हें foo.js. मिलेंगे। –

+1

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

0

मेरे पास बहुत बड़ी .json फ़ाइलें हैं। अधिकांश पाठक इस स्थिति में हैं। पूर्वावलोकन उत्तरों ने "सामग्री-प्रकार" लौटाए गए बारे में बात नहीं की। "सामग्री प्रकार: आवेदन/json"

मैं आप निम्नलिखित अनुरोध के साथ एक पूर्व संपीडित फ़ाइल वापसी चाहते पारदर्शी रूप से, ForceType साथ मल्टीव्यू का उपयोग

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

1) फ़ाइलों का नाम होना चाहिए: "file.ext

// Note there is no bigfile.json 
(...)/bigfile.json.gz 
(...)/bigfile.json.json 
: .ext "

2) मल्टीव्यू ForceType

फाइल सिस्टम के साथ अच्छा काम करता है

अपने अपाचे config में:

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

लघु और सरल :)

3

यह mod_negotiation का उपयोग कर, हालांकि यह थोड़ा नकचढ़ा है पूर्व संकुचित फ़ाइलों की सेवा के लिए संभव है। प्राथमिक कठिनाई यह है कि only requests for files which do not exist are negotiated। तो यदि foo.js और foo.js.gz दोनों मौजूद हैं, तो /foo.js के लिए प्रतिक्रिया हमेशा असम्पीडित होंगी (हालांकि /foo के लिए प्रतिक्रिया सही ढंग से काम करेगी)।

सबसे आसान समाधान मैंने पाया (from François Marier) के रूप में foo.js.js तो /foo.js के लिए अनुरोध foo.js.js (कोई एन्कोडिंग) और foo.js.gz (gzip एन्कोडिंग) के बीच बातचीत तो foo.js तैनात किया जाता है, एक डबल फ़ाइल एक्सटेंशन के साथ असम्पीडित फ़ाइलों का नाम बदलना है।

मैं निम्नलिखित विन्यास के साथ कि चाल गठबंधन:

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> 

मैं wrote a post जो इस विन्यास और विस्तार से कुछ विकल्प के लिए तर्क की चर्चा।

+0

बहुत अच्छा मुद्दा। – Otto

+0

यह अब और काम नहीं कर रहा है। अपाचे 2.4.25 के साथ मुझे हमेशा असम्पीडित परिणाम मिलते हैं, संभवत: मल्टीव्यूज़ केवल तभी होता है जब फ़ाइल नाम के रूप में मौजूद न हो। डॉक्टर बहुत ज्यादा कहते हैं। अफ़सोस की बात है! – MvG

+0

अच्छी पकड़ @ एमवीजी, आप बिल्कुल सही हैं! मैंने एक वर्कअराउंड के साथ जवाब अपडेट किया है, हालांकि यह आदर्श नहीं है क्योंकि इसे असम्पीडित फ़ाइल और कॉन्फ़िगरेशन ट्रिकरी का नाम बदलने की आवश्यकता है। आशा करता हूँ की ये काम करेगा! – Kevinoid

संबंधित मुद्दे

 संबंधित मुद्दे