如何同时 运行 Daphne 和 Gunicorn?

How to run Daphne and Gunicorn At The Same Time?

我正在使用 django-channels 因此我需要使用 daphne 但对于静态文件和其他我想使用的东西 gunicorn。我可以同时启动 daphnegunicorn,但我不能同时启动它们。

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

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

gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload && daphne -b 0.0.0.0 -p 8089 app.asgi:application

PS: 我将 / 中的 location/ws/ 中的 gunicornnginx.conf 中的 daphne 分开了。

你的问题是你在同一个进程中调用两个进程 context/line 而一个进程永远不会被调用,因为第一个进程永远不会“结束”。

这个过程: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 &

关于这类问题的授人以渔的信息是here

我相当肯定你会失去正常的控制台日志记录,你通常会通过 运行 在后台使用这些日志记录,因此我建议查看 nohup 而不是 & 或使用日志实用程序将日志发送到某处,这样您就不会盲目飞行。

至于其他选项,如果您计划扩展到大量用户,可能超过 100 个,我只需要 运行 两台服务器,一台用于 wsgi django http 请求,另一台用于 asgi daphne ws 请求。在两者之间使用 nginx 代理来满足您的任何需要,您就完成了。 That's also what channels recommends for larger applications.

It is good practice to use a common path prefix like /ws/ to distinguish WebSocket connections from ordinary HTTP connections because it will make deploying Channels to a production environment in certain configurations easier.

In particular for large sites it will be possible to configure a production-grade HTTP server like nginx to route requests based on path to either (1) a production-grade WSGI server like Gunicorn+Django for ordinary HTTP requests or (2) a production-grade ASGI server like Daphne+Channels for WebSocket requests.

Note that for smaller sites you can use a simpler deployment strategy where Daphne serves all requests - HTTP and WebSocket - rather than having a separate WSGI server. In this deployment configuration no common path prefix like /ws/ is necessary.

不需要 运行 both.Daphne 是一个 HTTP、HTTP2 和 WebSocket 协议服务器。 看看这里的 README link: https://github.com/django/daphne