如何同时 运行 Daphne 和 Gunicorn?
How to run Daphne and Gunicorn At The Same Time?
我正在使用 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
PS:
我将 /
中的 location
和 /ws/
中的 gunicorn
和 nginx.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
我正在使用 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
PS:
我将 /
中的 location
和 /ws/
中的 gunicorn
和 nginx.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