Aktivieren der Komprimierung auf Heroku mithilfe von Python

8

Google bestraft jetzt, weil es nicht so mobilfreundlich ist. Um die Dinge besser zu machen, empfehle ich, eine Menge meines Javascript mit Gzip oder Deflate zu komprimieren. Ich habe einige alte Empfehlungen zum Stack-Überlauf gesehen, aber es gibt nichts aus der Box und ich habe versucht, nach Add-Ons zu suchen, aber bis jetzt scheint es nichts zu geben, was den Trick machen würde. Was ist am wenigsten schmerzhaft und robust beim Komprimieren oder Aktivieren von gzip?

Folgendes schlägt Google vor:

Komprimierung aktivieren Das Komprimieren von Ressourcen mit gzip oder deflate kann die Anzahl der über das Netzwerk gesendeten Bytes reduzieren. Aktivieren Sie die Komprimierung für die folgenden Ressourcen, um ihre Übertragungsgröße um 420 KB (74% Reduktion) zu reduzieren.

Ich benutze Django, wenn es das einfacher macht.

    
disruptive 17.05.2015, 18:48
quelle

1 Antwort

9

Bottom Line Up Front - Es hängt von den Details Ihrer App ab ... Flask? Django? UWSGI? whitenoise und gunicorn scheinen die "Gehe zu" -Frameworks auf Heroku zu sein, also habe ich das im folgenden Beispiel verwendet. Es sollte sich auf andere Frameworks übertragen.

Erklärung - Der Kern der Google-Empfehlung besteht darin, die Anzahl der physisch vom Server übertragenen Bytes zu minimieren. Es gibt mehrere Möglichkeiten, dies zu tun, aber unter den höchsten Auswirkungen, in keiner bestimmten Reihenfolge -

  • Reduzieren Sie JavaScript und CSS
  • Verschmelzen Sie diese Dateien zusammen
  • Cache-Verhalten manipulieren
  • Komprimiert den HTTP-Antworttext

Die zitierte Empfehlung behandelt dieses letzte Bit und es ist wichtig zu verstehen, dass das Komprimieren des Antwortkörpers Teil der "Inhaltsverhandlung" in der HTTP-Spezifikation ist - der Browser fragt nicht einfach über die URL nach einer bestimmten Ressource; es gibt auch Hinweise über seine bevorzugte Darstellung dieser Ressource, z. B. welchen Inhaltstyp, wie es codiert ist, kann es in mehreren "Brocken", etc. gesendet werden.

Daher sollte im Idealfall die Schicht der Anwendung, die HTTP verarbeitet, mit dieser speziellen Aufgabe umgehen. In einem typischen Anwendungsstapel würde dies einen Webserver wie Apache oder nginx bedeuten, in dem der Webserver Anfragen nach bestimmten, dynamischen Pfaden zu Ihrem Web-Framework übernimmt und den "statischen" Inhalt direkt verarbeitet.

In Heroku wird die HTTP-Schicht jedoch zwischen der Plattform selbst und Ihrer Anwendung aufgeteilt. Das "Routing-Mesh" fungiert als Reverse-Proxy, der grundlegende HTTP- und HTTPS-Funktionen verarbeitet und die Anfragen zum Beispiel mit Proxydaten umsetzt ; Alles andere hängt von deiner App ab. Ihre "App" ist jedoch ziemlich eingeschränkt, da Sie nicht die Freiheit haben, nginx usw. zu installieren.

Die meisten Web-Frameworks (Django, Flask, Rails, Play! usw. usw.) sind hochgradig verallgemeinert und können in Verbindung mit einem externen Webserver (für die Produktion empfohlen) arbeiten oder können unabhängig voneinander arbeiten Lightweight Webserver (für die Entwicklung empfohlen). Die Frameworks passen auch gut zu "Containern", die sowohl die Laufzeitumgebung für die Anwendung als auch das Heavy-Lifting auf der HTTP-Ebene (uWSGI, Gunicorn, Rack usw.) bereitstellen.

Dies ist die Option für Heroku. Obwohl ich die meiste Erfahrung mit uWSGI habe, ist das folgende Beispiel für Flask + Gunicorn + WhiteNoise (die bevorzugte Bibliothek für die Bereitstellung von statischen Dateien auf Heroku in Python). Beachten Sie, dass WhiteNoise auch mit Django funktioniert, daher sollte die Anpassung trivial sein, sollte Django Ihr Framework der Wahl sein. All diese Ausführungen führen zu zwei recht einfachen Schritten:

  • Füge whitenoise zu deinem requirements.txt hinzu
  • Ändern Sie die WSGI-Anwendung so, dass WhiteNoise Ihre Anwendung "umschließt".

Zum Beispiel:

%Vor%

Damit erhalten Sie Inhalt, wenn der Client eine "Accept-Encoding: gzip" -Header sendet. Es gibt viele, viele andere Hebel und Knöpfe zu ziehen und zu zwicken, aber das ist ein Ausgangspunkt. Schließlich werden Sie sich Sorgen über den CPU-Overhead machen und die Dateien vorkomprimieren wollen. oder Sie können entscheiden, dass das Laden von statischen Dateien der richtige Weg ist.

Verwenden Sie zur Überprüfung ein Werkzeug wie cURL, um eine statische Datei zu erhalten:

%Vor%

Das -i -Flag sollte Header ausgeben, die Ihnen die Details anzeigen, wie die Anfrage geliefert wurde. Beachten Sie die Inhaltscodierung

%Vor%

Hoffe, das hilft ...

    
bimsapi 20.05.2015, 15:40
quelle

Tags und Links