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

时间:2019-05-01 09:25:08

标签: django deployment gunicorn whitenoise

我正在使用Whitenoise在Django应用中提供静态文件。我正在使用Nginx。我计划在将来像Cloudfront这样的CDN后面使用Whitenoise。参见Whitenoise FAQs

我一直在寻找可以解决以下问题的部署说明:

  1. 由于我没有使用nginx,因此我计划将gunicorn直接绑定到端口80。这将导致错误-Permission Denied。我可以将gunicorn作为root用户运行,但这似乎是一个不好的方法。

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

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

P.S .:矿山不会成为一个人流量大的网站。其他人则使用此配置为流量较高的网站提供服务。参见此Squeezing every drop of performance out of a Django app on Heroku

1 个答案:

答案 0 :(得分:0)

TL; DR

我使用nginx作为http服务器。我在nginx中删除了与静态文件关联的配置,因此静态文件请求被传递到wsgi层(gunicorn),并由Whitenoise处理。因此,您可以按照任何“ nginx + gunicorn + django”部署说明/指南进行操作,只需通过简单的Google搜索即可轻松获得。

此帖子为我清除了该帖子:Deploying your Django static files to AWS (Part 2)

长答案

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

  

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

未经验证,我认为这必须是正确的。 gunicorn不是完整的Web服务器。实际上,gunicorn创作者强烈建议在代理服务器(例如Nginx)之后使用它。 See docs

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

我已经知道了。不使用nginx或任何其他Web服务器将是愚蠢的。

Whitenoise可以为静态文件设置适当的缓存头,并使用gzip / brotli启用压缩。与whitenoise.storage.CompressedManifestStaticFilesStorage一起使用时,它将自动生成版本化的静态文件。例如。 /static/js/app.49ec9402.js(如果您已将文件作为{%statis%} 'js/app.js'放在模板中)。版本文件的最大有效期限设置为10年,即永久缓存。

如果您不打算在Heroku上进行部署,您仍将需要Nginx之类的Web服务器。因此,您可以按照任何“ nginx + gunicorn + django”部署说明/指南进行操作,只需通过简单的Google搜索即可轻松获得。 Deploying your Django static files to AWS (Part 2)是其中之一,它帮助我弄清了这个问题。