Django生产型Web服务器的管理命令
项目描述
django-webserver
以Django管理命令运行生产型Web服务器,例如pyuwsgi(即uWSGI)或gunicorn。
用法
-
安装一个变体
pip install django-webserver[pyuwsgi]
或
pip install django-webserver[gunicorn]
或
pip install django-webserver[uvicorn] # Python 3.5+ only
或
pip install django-webserver[waitress]
-
添加到
INSTALLED_APPS
INSTALLED_APPS = [ # ... "django_webserver", # ... ]
-
运行
manage.py pyuwsgi --http=:8000 ...
或
manage.py gunicorn
或
manage.py uvicorn
或
manage.py waitress --port=8000
配置
使用pyuwsgi
Pyuwsgi已经知道从Django管理命令环境使用的Python解释器和virtualenv(如果适用)。默认情况下,它将使用以下标志(使用settings.WSGI_APPLICATION
确定模块)
--strict --need-app --module={derived}
如果您已定义STATIC_URL
带有本地URL,它还将添加从STATIC_URL
和STATIC_ROOT
派生的--static-map
。
您可以通过命令行传递uWSGI接受的任何其他参数。
但uWSGI有很多标志,其中许多标志您希望在每次运行项目时都使用。对于这种情况,您可以使用可选设置PYUWSGI_ARGS
配置自己的默认值。以下是一个可能对您有帮助的示例
PYUWSGI_ARGS = [
"--master",
"--strict",
"--need-app",
"--module".
":".join(WSGI_APPLICATION.rsplit(".", 1)),
"--no-orphans",
"--vacuum",
"--auto-procname",
"--enable-threads",
"--offload-threads=4",
"--thunder-lock",
"--static-map",
"=".join([STATIC_URL.rstrip("/"), STATIC_ROOT]),
"--static-expires",
"/* 7776000",
]
别忘了设置类似于--socket=:8000
或--http=:8000
的东西,以便您的应用程序监听端口。根据您的设置,通过命令行传递此参数可能比在设置中硬编码它更有意义。
使用gunicorn
与标准 gunicorn 配置相同,但应用将由 settings.WSGI_APPLICATION
自动设置。
注意:与其他服务器不同,您必须通过环境变量或 sys.argv
来配置 gunicorn。如果您使用 Django 的 call_command
,请注意您传递的任何额外参数都不会生效。
使用 uvicorn
与标准 uvicorn 配置相同,但应用将由 settings.WSGI_APPLICATION
以及 --wsgi
自动设置。
使用 waitress
与标准 waitress-serve
参数相同,但应用将由 settings.WSGI_APPLICATION
自动设置。
与其他服务器不同,waitress 支持 Windows。
预先预热您的应用
默认
WEBSERVER_WARMUP = True
通常,当 WSGI 服务器启动时,它将绑定必要的端口,然后导入/设置您的应用。在大型项目中,启动可能需要几秒钟。在这段时间内,它无法响应用户请求。
为了避免这种情况,此应用在启动相关服务器之前导入您的 WSGI 模块。如果出于某种原因,这种行为不理想,您可以在设置中设置 WEBSERVER_WARMUP = False
。
启动时运行健康检查
默认情况下不启用。它需要 WEBSERVER_WARMUP = True
。
WEBSERVER_WARMUP_HEALTHCHECK = "/-/health/"
在启动服务器之前,调用提供的 URL,如果它没有返回 200
,则退出失败。
如果您的应用无法成功响应用户请求,则立即退出可能会有所帮助。您的进程或容器管理器应立即显示服务失败,而不是等待负载均衡器或其他监控工具通知。
动机
在某些场景中,将 Django 项目与单个命令行交互入口点一起分发是有益的。当构建 Docker 容器或带有类似 shiv 的自包含 Python 应用时,这会很有用。
预先预热应用和运行健康检查可以为一些零停机部署场景打开大门,这在之前由于“预热您的应用”中描述的问题而不可能实现。例如,您可以使用 uWSGI 或 gunicorn 的 --reuse-port
选项在同一端口上启动新版本的应用,知道它已经预热并健康。启动成功后,可以安全地关闭旧版本,而不会丢失任何流量。