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_APPSINSTALLED_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 选项在同一端口上启动新版本的应用,知道它已经预热并健康。启动成功后,可以安全地关闭旧版本,而不会丢失任何流量。