如何使用 gunicorn 部署 Django + Whitenoise 应用程序?

Gun*_*Fan 5 deployment django gunicorn whitenoise

我正在使用Whitenoise在我的 Django 应用程序中提供静态文件。我没有使用 Nginx。我计划将来在像 Cloudfront 这样的 CDN 后面使用 Whitenoise。请参阅白噪声常见问题解答

我一直在寻找处理这些问题的部署说明:

  1. 由于我没有使用nginx,我打算将gunicorn直接绑定到80端口。这会导致错误 - Permission Denied。我可以以 root 身份运行 gunicorn,但这似乎是一个糟糕的方法。

  2. 如何处理 SSL 证书的东西?通常这是由 Nginx 之类的服务器处理的。

编辑:我正在Google Cloud Compute Engine上的Ubuntu 18.04 VM上部署我的应用程序。

PS:我的网站不会是一个非常高流量的网站。其他人已使用此配置为高流量的网站提供服务。请参阅从 Heroku 上的 Django 应用程序中榨取每一滴性能

Gun*_*Fan 6

TL; 博士

我使用 nginx 作为 http 服务器。我在 nginx 中删除了与静态文件相关的配置,因此静态文件请求被传递到 wsgi 层(gunicorn)并由 Whitenoise 处理。因此,您可以遵循任何“nginx + gunicorn + django”部署说明/教程,通过简单的谷歌搜索即可轻松获得。

这篇文章为我澄清了:将您的 Django 静态文件部署到 AWS(第 2 部分)

长答案

如前所述,有很多关于在 Heroku 上部署 Django + Whitenoise 应用程序的教程。正如评论中指出的那样:

Heroku,它在前端有自己的代理层,因此根本不相关。

没有验证这个说法,我认为这一定是真的。gunicorn 不是一个成熟的网络服务器。事实上,gunicorn 创建者强烈建议在代理服务器(例如 Nginx)后面使用它。请参阅文档

我很困惑,因为我一直认为 Nginx 只是一个反向代理。作为静态资产的反向代理只是nginx的功能之一。它提供了更多功能,例如缓冲慢速客户端,而 gunicorn 没有,这有助于防止拒绝服务攻击。

这我早就知道了。不使用 nginx 或任何其他网络服务器是愚蠢的。

Whitenoise 只是为静态文件设置适当的缓存标头,并使用 gzip/brotli 启用压缩。与 一起使用时whitenoise.storage.CompressedManifestStaticFilesStorage,它将自动生成版本化的静态文件。例如。/static/js/app.49ec9402.js如果您已将文件作为{%statis%} 'js/app.js'. 版本化文件将 max-age 设置为 10 年,即永久缓存。

如果你不是在 Heroku 上部署,你仍然需要一个像 Nginx 这样的网络服务器。因此,您可以遵循任何“nginx + gunicorn + django”部署说明/教程,通过简单的谷歌搜索即可轻松获得。其中之一是将您的 Django 静态文件部署到 AWS(第 2 部分),这帮助我解决了这个问题。

  • 你应该为此得到更多的支持。这当然也让我感到困惑。他们应该提供白噪声发挥作用的堆栈图。甚至 Jacob Kaplan-Moss 在他的演讲中[此处](https://youtu.be/E613X3RBegI?t=337]) 也表示我们现在可以使用白噪声来服务我们的静态文件**和动态文件**。现在我明白了,我想这是不正确的。 (2认同)