用于生产Web服务器的Django管理命令
django-webserver的Python项目详细描述
django网络服务器
以django管理命令的形式运行生产web服务器,如pyuwsgi(aka 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}
如果您使用本地url定义了STATIC_URL
,那么它还将添加--static-map
,派生自STATIC_URL
和STATIC_ROOT
。
您可以从命令行传递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
为您设置应用程序。
服务生
与标准的^{settings.WSGI_APPLICATION
为您设置应用程序。
与其他服务器不同,windows支持服务生。
预热应用程序
默认值:
WEBSERVER_WARMUP=True
通常,当wsgi服务器启动时,它将绑定到必需的端口,然后导入/设置应用程序。在大型项目中,启动需要几秒钟是正常的。在此期间,它无法响应传入的请求。
为了避免停机,此应用程序在启动相关服务器之前导入wsgi模块。如果由于某种原因,这种行为是不可取的,您可以在设置中设置WEBSERVER_WARMUP = False
。
启动时运行健康检查
默认情况下不启用。它需要WEBSERVER_WARMUP = True
。
WEBSERVER_WARMUP_HEALTHCHECK="/-/health/"
在启动服务器之前,内部调用所提供的URL,如果不返回^ {< CD19>},则退出。
<> P>如果您的应用程序无法成功地响应健康检查,那么立即退出您的应用程序是有帮助的。进程或容器管理器应立即显示服务失败,而不是等待负载平衡器或其他监视工具通知捕获问题。动机
在某些场景中,使用单个入口点分发django项目以进行命令行交互是有益的。当使用shiv之类的东西构建docker容器或自包含的python应用程序时,这可能很有用。
预热应用程序并运行健康检查也可以为一些零停机部署场景打开大门,这些场景以前由于“预热应用程序”中描述的问题而不可能实现。例如,您可以使用uwsgi或gunicorn中的--reuse-port
选项在同一端口上启动应用程序的新版本,因为您知道该应用程序已经预热并且运行正常。成功之后启动时,旧版本可以安全地被拆掉,而不会减少任何流量。