2015-05-17 3 views
8

का उपयोग करते हुए हेरोकू पर संपीड़न को सक्षम करने से Google अब मोबाइल अनुकूल नहीं होने के कारण दंडित करता है। तो चीजों को बेहतर बनाने के प्रयास में, यह सिफारिश करता है कि मैं अपने बहुत सारे जावास्क्रिप्ट को Gzip या Deflate से संपीड़ित करता हूं। मैंने स्टैक ओवरफ़्लो पर कुछ पुरानी सिफारिशें देखी हैं, लेकिन बॉक्स से कुछ भी नहीं है और मैंने एड-ऑन की खोज करने की कोशिश की, लेकिन अभी तक ऐसा कुछ भी नहीं है जो चाल करेगा। Gzip को संपीड़ित करने या सक्षम करने का सबसे कम दर्दनाक और मजबूत क्या है?पाइथन

gzip से संपीड़न को संपीड़ित संसाधनों सक्षम या हवा निकालना नेटवर्क पर भेजी गई बाइट की संख्या को कम कर सकते हैं:

यहाँ गूगल से पता चलता है कि मैं क्या है। 420KiB (74% कमी) द्वारा उनके स्थानांतरण आकार को कम करने के लिए निम्न संसाधनों के लिए संपीड़न सक्षम करें।

मैं Django का उपयोग कर रहा हूं अगर इससे कोई आसान हो जाता है।

उत्तर

9

नीचे रेखा ऊपर फ्रंट - यह आपके ऐप के विवरण पर निर्भर करेगा ... फ्लास्क? Django? uWSGI? प्रतीत होता है कि whitenoise और gunicorn हेरोोकू पर "जाने के लिए" ढांचे के रूप में प्रतीत होता है, इसलिए मैंने नीचे दिए गए उदाहरण में यही उपयोग किया है। इसे अन्य ढांचे में अनुवाद करना चाहिए।

स्पष्टीकरण - Google की सिफारिश का सारांश सर्वर से शारीरिक रूप से स्थानांतरित बाइट्स की संख्या को कम करने के बारे में है। ऐसा करने के कई तरीके हैं, लेकिन उच्चतम प्रभाव, कोई विशेष क्रम में बीच -

  • JavaScript कम करें और सीएसएस
  • उन फ़ाइलों को मर्ज एक साथ
  • हेरफेर कैश व्यवहार
  • HTTP प्रतिक्रिया शरीर संक्षिप्त

है कि पिछले बिट के साथ उद्धृत सिफारिश सौदों, और यह समझना महत्वपूर्ण है कि प्रतिक्रिया शरीर को संपीड़ित "सामग्री बातचीत" HTTP विनिर्देशन में का हिस्सा है महत्वपूर्ण है - ख Rowser सिर्फ यूआरएल के माध्यम से एक विशेष संसाधन के लिए नहीं पूछता है; यह उस संसाधन के अपने पसंदीदा प्रतिनिधित्व के बारे में संकेत भी प्रदान करता है, उदाहरण के लिए, यह किस प्रकार का एन्कोड किया गया है, इसे एन्कोड किया गया है, इसे कई "भाग" आदि में भेजा जा सकता है।

इस प्रकार, आदर्श रूप से, HTTP को संभालने वाले एप्लिकेशन की परत इस विशेष कार्य को संभालना चाहिए। एक सामान्य अनुप्रयोग स्टैक में, इसका अर्थ अपाचे या nginx जैसे वेब सर्वर होगा, जिसमें वेब सर्वर आपके वेब ढांचे के विशिष्ट, गतिशील पथों के लिए प्रॉक्सी अनुरोध करेगा, और "स्थैतिक" सामग्री को सीधे संभाल देगा।

हेरोकू में, हालांकि, HTTP परत प्लेटफार्म के बीच और आपके आवेदन के बीच विभाजित है - "रूटिंग जाल" रिवर्स प्रॉक्सी के रूप में कार्य करता है, मूल HTTP और HTTPS को संभालने और प्रॉक्सी जानकारी के साथ शीर्षकों को इंजेक्शन द्वारा अनुरोधों को बढ़ाने के लिए उदाहरण; बाकी सब कुछ आपके ऐप पर है। हालांकि, आपका "ऐप" काफी बाधित है, क्योंकि आपके पास nginx इंस्टॉल करने के लिए फ्री-रीब्यूशन नहीं है, इसलिए

अधिकांश वेब फ्रेमवर्क (Django, फ्लास्क, रेल, प्ले !, इत्यादि) अत्यधिक सामान्यीकृत होते हैं , और बाहरी वेब सर्वर (उत्पादन के लिए अनुशंसित) के संयोजन के साथ काम कर सकते हैं या स्वतंत्र रूप से काम कर सकते हैं, आमतौर पर हल्के वेब सर्वर (विकास के लिए अनुशंसित) प्रदान करते हैं। ढांचे में "कंटेनर" के साथ अच्छी तरह से जोड़ा जाता है जो एप्लिकेशन के लिए रन-टाइम पर्यावरण और HTTP परत (यूडब्ल्यूएसजीआई, गनिकॉर्न, रैक इत्यादि) पर भारी भारोत्तोलन प्रदान करता है

यह विकल्प है Heroku।यद्यपि मुझे यूडब्ल्यूएसजीआई के साथ सबसे अधिक अनुभव है, लेकिन नीचे दिया गया उदाहरण फ्लास्क + गनिकॉर्न + व्हाइटनोइस (पाइथन में हेरोकू पर स्थिर फाइलों की सेवा के लिए पसंदीदा लाइब्रेरी) के लिए है। ध्यान दें कि व्हाइटनोइस डीजेंगो के साथ भी काम करता है, इसलिए इसका अनुकूलन छोटा होना चाहिए, क्या Django को अपनी पसंद का ढांचा होना चाहिए। तो, दो सुंदर सरल चरणों में है कि सभी प्रदर्शनी परिणाम आरंभ करने के लिए:

  • अपने requirements.txt
  • whitenoise के लिए WSGI आवेदन संशोधित करें "रैप" अपने आवेदन करने के लिए whitenoise जोड़ें।

उदाहरण के लिए: शीर्ष लेख:

from flask import Flask 
from whitenoise import WhiteNoise 

flapp = Flask(__name__) 
#use a subdirectory for root, otherwise, the actual .py files can be served... 
app = WhiteNoise(flap, root='./static/') 

#define your routes: 
@flapp.route('/') 
def home_page(): 
    #etc. etc. 

यह आपको gzip'd सामग्री ग्राहक एक "gzip Accept-Encoding" भेजता है, तो मिल जाएगा। खींचने और ट्विक करने के लिए कई अन्य लीवर और knobs हैं, लेकिन यह एक शुरुआती बिंदु है। आखिरकार, आप सीपीयू ओवरहेड के बारे में चिंता करेंगे और फाइलों को प्री-कंप्रेस करना चाहते हैं; या आप तय कर सकते हैं कि ऑफ-लोडिंग स्थैतिक फाइलें जाने का तरीका है।

curl -i -H "Accept-Encoding: gzip" http://yourapp.herokuapp.com/path/to/static 

-i झंडा हेडर, जो आप कैसे अनुरोध परोसा गया था के विवरण दिखा सकते हैं प्रिंट आउट करना चाहिए:

सत्यापित करने के लिए, एक स्थिर फ़ाइल हड़पने के लिए cURL जैसे उपकरण भी। नोट `सामग्री-एन्कोडिंग

HTTP/1.1 200 OK 
Connection: keep-alive 
Server: gunicorn/19.3.0 
Date: Wed, 20 May 2015 15:33:35 GMT 
Last-Modified: Wed, 20 May 2015 15:26:06 GMT 
Content-Type: text/html; charset="utf-8" 
Cache-Control: public, max-age=60 
Access-Control-Allow-Origin: * 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 662 
Via: 1.1 vegur 

आशा इस मदद करता है ...

+0

महान जवाब। WhiteNoise एक अच्छा विचार प्रतीत होता है - आपके अनुभव से बाहर होने वाले कॉन्फ़िगरेशन पर निर्भर किए बिना सर्वोत्तम अभ्यास प्रदान करना, या आपके मामले में (मेरे मामले में)। – bsa