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

问题描述 投票:0回答:2

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

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

  1. 由于我没有使用nginx,所以我打算将gunicorn直接绑定到端口80。这会导致错误 -

    Permission Denied
    。我可以以root身份运行gunicorn,但这似乎是一个糟糕的方法。

  2. 如何处理SSL证书的事情?通常这是由 Nginx 这样的服务器处理的。

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

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

django deployment gunicorn whitenoise
2个回答
10
投票

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 这样的 Web 服务器。因此,您可以遵循任何“nginx + Gunicorn + django”部署说明/教程,只需通过简单的谷歌搜索即可轻松获得。其中之一是将 Django 静态文件部署到 AWS(第 2 部分),这帮助我解决了这个问题。


0
投票
以下是有关如何将 Whitenoise 添加到 Django 应用程序的分步教程:

安装白噪声:

pip install whitenoise
在 Django 设置中配置 Whitenoise:
在 Django 项目的 settings.py 文件中,将whitenoise.middleware.WhiteNoiseMiddleware 添加到 MIDDLEWARE 列表中,最好是在最后:

pythonCopy codeMIDDLEWARE = [ # ... 'whitenoise.middleware.WhiteNoiseMiddleware', ]
另外,配置静态文件设置:

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATIC_URL = '/static/'
用于提供媒体文件的附加配置(如果您上传)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
为静态文件启用白噪声:
在 Django 项目的 settings.py 文件中,在末尾添加以下行:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
收集静态文件:
运行以下命令将所有静态文件收集到 STATIC_ROOT 目录中:

python manage.py collectstatic
此命令将从 Django 应用程序收集所有静态文件并将它们复制到 STATIC_ROOT 目录。
更新 wsgi.py:
在 Django 项目的 wsgi.py 文件中,在顶部添加以下行以启用 Whitenoise:

import os from django.core.wsgi import get_wsgi_application from whitenoise import WhiteNoise os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings") application = get_wsgi_application() application = WhiteNoise(application)
将“your_project”替换为您的 Django 项目的名称。
运行你的 Django 应用程序:
启动 Django 开发服务器或将应用程序部署到 Heroku 等托管平台。 Whitenoise 现在应该可以有效地为您的静态文件提供服务。

就是这样!通过这些步骤,您已成功将 Whitenoise 添加到 Django 应用程序中,从而允许您直接从 Django 应用程序提供静态文件。每当您添加或修改静态文件时,请记住

run python manage.py collectstatic

,以确保它们被正确收集。

© www.soinside.com 2019 - 2024. All rights reserved.