前面的底线 - 这将取决于您的应用程序的详细信息... Flask?姜戈? uWSGI?whitenoise
and gunicorn
似乎是 Heroku 上的“go to”框架,所以这就是我在下面的示例中使用的。它应该转换为其他框架。
说明 - Google 建议的要点是尽量减少从服务器物理传输的字节数。有多种方法可以做到这一点,但其中影响最大的方法(排名不分先后):
- 缩小 JavaScript 和 CSS
- 将这些文件合并在一起
- 操纵缓存行为
- 压缩 HTTP 响应正文
引用的建议涉及最后一点,重要的是要了解压缩响应正文是 HTTP 规范中“内容协商”的一部分 - 浏览器不仅仅通过 URL 请求特定资源;它还通过 URL 请求特定资源。它还提供有关该资源的首选表示形式的提示,例如,内容类型、编码方式、是否可以以多个“块”形式发送等。
因此,理想情况下,处理 HTTP 的应用程序层应该处理此特定任务。在典型的应用程序堆栈中,这意味着像 Apache 或 nginx 这样的 Web 服务器,其中 Web 服务器将代理对 Web 框架的特定动态路径的请求,并直接处理“静态”内容。
然而,在 Heroku 中,HTTP 层在平台本身和应用程序之间分开——“路由网格”充当反向代理,处理基本的 HTTP 和 HTTPS,并通过注入带有代理信息的标头来增强请求;其他一切都取决于您的应用程序。然而,你的“应用程序”相当受限,因为你没有自由安装 nginx 等。
大多数 Web 框架(Django、Flask、Rails、Play!等)都是高度通用化的,可以与外部 Web 服务器(推荐用于生产)结合使用,也可以独立工作,提供自己的、通常是轻量级的 Web 服务器(推荐用于开发)。这些框架还与“容器”很好地配合,为应用程序提供运行时环境,并在 HTTP 层(uWSGI、Gunicorn、Rack 等)提供繁重的工作。
这是 Heroku 的选择。尽管我对 uWSGI 拥有最多的经验,但下面的示例是 Flask + Gunicorn + WhiteNoise(在 Python 中的 Heroku 上提供静态文件的首选库)。请注意,WhiteNoise 也适用于 Django,因此如果 Django 是您选择的框架,那么对其进行调整应该很简单。因此,所有这些说明都只需两个非常简单的步骤即可开始:
- Add
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.
如果客户端发送“Accept-Encoding:gzip”标头,这将为您提供 gzip 内容。还有很多很多其他的杠杆和旋钮可以拉动和调整,但这是一个起点。最终,您会担心 CPU 开销并希望预压缩文件;或者您可能会决定卸载静态文件是正确的方法。
要进行验证,请使用 cURL 等工具来获取静态文件:
curl -i -H "Accept-Encoding: gzip" http://yourapp.herokuapp.com/path/to/static
The -i
flag 应该打印出标头,这将向您显示如何处理请求的详细信息。注意“内容编码”
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
希望这可以帮助...