Включение сжатия на 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
надеюсь, что это помогает...