2015-05-17 3 views
8

Теперь Google штрафует из-за того, что он не является мобильным. Поэтому, чтобы улучшить ситуацию, я рекомендую сжать много моего Javascript с помощью Gzip или Deflate. Я видел некоторые старые рекомендации по переполнению стека, но ничего не стоит из коробки, и я пробовал искать дополнения, но пока нет ничего, что могло бы сделать трюк. Что является наименее болезненным и надежным сжиманием или включением gzip?Включение сжатия на Heroku с использованием python

Вот что Google предлагает мне сделать:

Включить сжатие Сжатие ресурсов с помощью Gzip или выкачать может уменьшить количество байтов, передаваемых по сети. Включить сжатие для следующих ресурсов, чтобы уменьшить их размер передачи на 420KiB (уменьшение на 74%).

Я использую Django, если это упростит.

ответ

9

Bottom Line Up Front - Это зависит от деталей вашего приложения ... Flask? Django? uWSGI? whitenoise и gunicorn, похоже, являются «идеей к» фреймворкам на Heroku, так вот что я использовал в приведенном ниже примере. Он должен перевести на другие рамки.

Explication - Суть рекомендации Google заключается в минимизации количества байтов, физически переданных с сервера. Есть несколько способов сделать это, но среди наиболее сильного воздействия, в частности, нет порядка -

  • Минимизировать JavaScript и CSS
  • Объединить эти файлы вместе
  • Манипулировать поведение кэша
  • Сжать тело ответа HTTP

К цитируемой рекомендации относится этот последний бит, и важно понимать, что сжатие тела ответа является частью «согласования содержимого» в спецификации HTTP - b rower не просто запрашивает определенный ресурс через URL; он также содержит подсказки о его предпочтительном представлении этого ресурса, например, какой тип контента, как он кодируется, может ли он быть отправлен в нескольких «кусках» и т. д.

Таким образом, в идеале, слой приложения, который обрабатывает HTTP-адрес должен справиться с этой конкретной задачей. В типичном стеке приложений это будет означать веб-сервер, такой как Apache или nginx, в котором веб-сервер будет запрашивать прокси-запросы для конкретных динамических путей в вашей веб-среде и обрабатывать «статический» контент напрямую.

В Heroku, однако, уровень HTTP разделен между самой платформой и вашим приложением - «сетка маршрутизации» действует как обратный прокси-сервер, обрабатывает базовые HTTP и HTTPS и улучшает запросы, вводя заголовки с информацией прокси, для пример; все остальное зависит от вашего приложения. Однако ваше «приложение» довольно ограничено, так как у вас нет свободного владения для установки nginx и т. Д.

Большинство веб-фреймворков (Django, Flask, Rails, Play !, и т. Д. И т. Д.) Очень обобщены , и может работать совместно с внешним веб-сервером (рекомендуется для производства) или может работать независимо, предоставляя свои собственные, обычно облегченные веб-серверы (рекомендуется для разработки). Рамки также хорошо сочетаются с «контейнерами», которые обеспечивают как среду выполнения для приложения, так и тяжелую работу на уровне HTTP (uWSGI, Gunicorn, Rack и т. Д.).

Это вариант, Heroku.Хотя у меня больше всего опыта работы с uWSGI, ниже приведен пример Flask + Gunicorn + WhiteNoise (предпочтительная библиотека для обслуживания статических файлов на Heroku в Python). Обратите внимание: WhiteNoise также работает с Django, поэтому адаптация этого должна быть тривиальной, если Django будет вашей каркасной выборкой. Таким образом, все, что результаты экспозиции в двух довольно простых шагах, чтобы начать работу:

  • Добавить whitenoise в свою requirements.txt
  • Измените приложение 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 содержимое, если клиент посылает "Accept-Encoding: GZIP" заголовок. Есть много, много других рычагов и ручек, чтобы тянуть и настраивать, но это отправная точка. В конце концов, вы будете беспокоиться о накладных расходах процессора и хотите предварительно сжать файлы; или вы можете решить, что статические файлы с загрузкой - это путь.

Для проверки используйте инструмент как CURL, чтобы захватить статический файл:

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

Флаг -i должен распечатать заголовки, которые будут показывать вам подробную информацию о том, как был подан запрос. Обратите внимание на `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 

Надеется, что это помогает ...

+0

Великого ответу. WhiteNoise кажется отличной идеей - предоставление лучших практик, не полагаясь на конфигурацию, которая может быть из ваших рук, или (в моем случае) вне вашего диапазона опыта. – bsa

Смежные вопросы