2015-05-17 15 views
8

Google teraz karać ze względu na nie jest tak przyjazny dla telefonu komórkowego. Dlatego, aby ulepszyć działanie, zaleca się skompresowanie dużej ilości kodu JavaScript z Gzip lub Deflate. Zauważyłem kilka starych zaleceń dotyczących przepełnienia stosu, ale nie ma nic wyskakującego z pudełka i próbowałem szukać dodatków, ale jak na razie wydaje się, że nic nie pomoże. Co jest najmniej bolesne i odporne na kompresowanie lub włączanie gzip?Włączenie kompresji na Heroku za pomocą python

Oto co Google sugeruje zrobić:

włączyć kompresję Kompresja zasobów gzip lub deflate może zmniejszyć liczbę bajtów przesyłanych przez sieć. Włącz kompresję dla następujących zasobów, aby zmniejszyć ich rozmiar transferu o 420 KB (74% redukcji).

Używam Django, jeśli to sprawia, że ​​łatwiejsze.

Odpowiedz

9

Bottom Line Up Front - To będzie zależało od szczegółów twojej aplikacji ... Flask? Django? uWSGI? whitenoise i gunicorn wydają się być frameworkami "przejdź do" na Heroku, więc to właśnie użyłem w poniższym przykładzie. Powinien przełożyć się na inne struktury.

Wyjaśnienie - Istota zalecenia Google polega na zminimalizowaniu liczby bajtów przesłanych fizycznie z serwera. Istnieje kilka sposobów, aby to zrobić, ale wśród najwyższego wpływu, w przypadkowej kolejności -

  • Minify JavaScript i CSS
  • Merge te pliki razem
  • manipulować zachowanie cache
  • ściskać korpus odpowiedzi HTTP

Przytoczone zalecenie dotyczy tego ostatniego bitu i ważne jest zrozumienie, że kompresja treści odpowiedzi jest częścią "negocjacji treści" w specyfikacji HTTP - b Rowser nie wymaga tylko określonego zasobu za pośrednictwem adresu URL; zawiera również wskazówki dotyczące preferowanej reprezentacji tego zasobu, np. jaki rodzaj zawartości, w jaki sposób jest kodowany, czy może być wysłany w wielu "porcjach", itp.

Idealnie więc warstwa aplikacji obsługującej HTTP powinien obsługiwać to konkretne zadanie. W typowym stosie aplikacji oznaczałoby to serwer WWW, taki jak Apache lub nginx, w którym serwer sieciowy będzie obsługiwał żądania konkretnych, dynamicznych ścieżek do twojej struktury internetowej i bezpośrednio obsługiwał "statyczną" zawartość.

Jednak w Heroku warstwa HTTP jest dzielona między samą platformę a Twoją aplikację - "siatka routingu" działa jako odwrotny serwer proxy, obsługując podstawowe protokoły HTTP i HTTPS i poprawiając żądania poprzez wstrzykiwanie nagłówków informacji o proxy, dla przykład; wszystko inne zależy od Twojej aplikacji. Jednak Twoja "aplikacja" jest dość ograniczona, ponieważ nie masz darmowego panowania przy instalacji nginx, itp.

Większość frameworków internetowych (Django, Flask, Rails, Play !, itp.) Jest wysoce uogólnionych i może współpracować z zewnętrznym serwerem WWW (zalecanym do produkcji) lub pracować samodzielnie, dostarczając własne, zwykle lekkie serwery sieciowe (zalecane do programowania). Struktury te dobrze łączą się również z "kontenerami", które zapewniają zarówno środowisko pracy aplikacji i podnoszenia ciężkich warstw HTTP (uWSGI, Gunicorn, Rack itp.).

Jest to opcja, którą można zastosować z Heroku.Chociaż mam największe doświadczenie z uWSGI, poniższy przykład dotyczy Flask + Gunicorn + WhiteNoise (preferowana biblioteka do udostępniania statycznych plików na Heroku w Pythonie). Zauważ, że WhiteNoise działa również z Django, więc dostosowanie go powinno być trywialne, jeśli Django będzie twoim wyborem. Tak, że wyniki wszystkich ekspozycji w dwóch całkiem prostych kroków, aby zacząć:

  • Dodaj whitenoise do requirements.txt
  • zmodyfikować aplikację WSGI mieć whitenoise „wrap” aplikacji.

Na przykład:

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. 

To będzie Ci spakowane gzipem zawartości, jeśli klient wysyła "Accept-Encoding: gzip" nagłówek. Istnieje wiele, wiele innych dźwigni i gałek do przeciągania i dostrajania, ale to jest punkt wyjścia. W końcu będziesz martwić się o obciążenie procesora i chcesz wstępnie skompresować pliki; lub możesz zdecydować, że odciążenie plików statycznych jest drogą do zrobienia.

Aby sprawdzić, należy użyć narzędzia takie jak cURL, aby pobrać plik statyczny:

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

-i flaga powinna wydrukować nagłówki, który pokaże Ci szczegóły jak wniosek został doręczony. Uwaga Opcja `Content-Encoding

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 

Hope this helps ...

+0

Wielką odpowiedź. WhiteNoise wydaje się świetnym pomysłem - zapewnienie najlepszej praktyki bez polegania na konfiguracji, która może być poza twoimi rękami lub (w moim przypadku) poza zasięgiem twojego doświadczenia. – bsa