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 ...
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