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