Включение сжатия на Heroku с помощью python

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

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

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

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

1 ответов


нижняя линия фронта - это будет зависеть от деталей вашего приложения... Фляжка? Джанго? на uwsgi? whitenoise и gunicorn кажется," перейти к " фреймворкам на Heroku, так что это то, что я использовал в примере ниже. Его следует перевести на другие рамки.

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

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

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

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

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

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

это вариант, чтобы пойти с Heroku. Хотя у меня больше всего опыта работы с uWSGI, пример ниже для колбы + 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'D, если клиент отправит заголовок" Accept-Encoding: gzip". Есть много, много других рычагов и ручек, чтобы тянуть и настраивать, но это отправная точка. В конце концов, вы будете беспокоиться о накладных расходах процессора и хотите предварительно сжать файлы; или вы можете решить, что выгрузка статических файлов-это путь.

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

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

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

надеюсь, что это помогает...