如何同时运行Daphne和Gunicorn?

Joh*_*ohn 3 django nginx gunicorn daphne

我正在使用django-channels,因此我需要使用daphne,但对于静态文件和其他我想使用的东西gunicorn。我可以daphne从旁边开始gunicorn开始,但不能同时开始。

我的问题是我应该同时启动它们还是有更好的选择?如果我应该怎么做?

这是我正在运行的服务器命令:

gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload && daphne -b 0.0.0.0 -p 8089 app.asgi:application
Run Code Online (Sandbox Code Playgroud)

PS:我拆分了locationof//ws/forgunicorndaphnein nginx.conf

小智 9

您的问题是您在同一上下文/行中调用两个进程,并且一个进程永远不会被调用,因为第一个进程永远不会“结束”。

这个流程:gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload

不会在任何时候终止,因此 && 命令永远不会运行,除非您手动终止该命令,此时我不确定这不会完全终止整个进程链。

如果你想运行这两个进程,你可以使用 & 例如将两个进程置于后台

(无法测试,但这应该有效)

gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload & daphne -b 0.0.0.0 -p 8089 app.asgi:application &
Run Code Online (Sandbox Code Playgroud)

有关此类问题的教人钓鱼的信息就在这里

我相当确定您将丢失通常在后台运行这些控制台日志记录时所拥有的正常控制台日志记录,因此我建议您进行调查nohup而不是&使用日志记录实用程序进行调查,而不是将日志发送到某处,这样您就不会盲目。

至于其他选项,如果您计划扩展到大量用户,可能超过 100 个,我只会运行两台服务器,一台用于 wsgi django http 请求,一台用于 asgi daphne ws 请求。在两者之间设置 nginx 代理来满足您的任何需要,然后就完成了。这也是渠道为大型应用程序推荐的做法。

最好使用 /ws/ 等通用路径前缀来区分 WebSocket 连接和普通 HTTP 连接,因为这将使在某些配置中将 Channel 部署到生产环境变得更容易。

特别是对于大型站点,可以配置生产级 HTTP 服务器(例如 nginx),根据路径将请求路由到(1)生产级 WSGI 服务器(例如用于普通 HTTP 请求的 Gunicorn+Django)或(2)生产级服务器- 级 ASGI 服务器,例如 Daphne+Channels,用于 WebSocket 请求。

请注意,对于较小的站点,您可以使用更简单的部署策略,其中 Daphne 服务所有请求 - HTTP 和 WebSocket - 而不是使用单独的 WSGI 服务器。在此部署配置中,不需要像 /ws/ 这样的公共路径前缀。