我使用的是 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
和 daphne
在 nginx.conf
.
你的问题是你在同一个上下文行中调用了两个进程,其中一个进程从未被调用,因为第一个进程从未 "结束"。
这个进程。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 &
教人钓鱼这类问题的信息是 此处
我很确定你会失去正常的控制台日志,你通常会有在后台运行这些,因此我建议你看一下 nohup
而不是 &
或者用日志工具把日志发到某个地方,这样你就不会盲目飞行了。
至于其他的选择,如果你打算扩大到大量的用户,大概有100多个,我会只运行两个服务器,一个用于wsgi django http请求,一个用于asgi daphne ws请求。两台之间用nginx代理,你需要什么就用什么,就可以了。这也是渠道对大型应用的建议。
使用像ws这样的通用路径前缀来区分WebSocket连接和普通的HTTP连接是一个很好的做法,因为这将使在某些配置中部署Channels到生产环境更容易。
特别是对于大型网站来说,可以配置生产级的HTTP服务器(如nginx),根据路径将请求路由到(1)生产级的WSGI服务器(如Gunicorn+Django)来处理普通的HTTP请求,或者(2)生产级的ASGI服务器(如Daphne+Channels)来处理WebSocket请求。
需要注意的是,对于小型站点,你可以使用更简单的部署策略,在这种情况下,Daphne服务于所有的请求--HTTP和WebSocket--而不是拥有一个单独的WSGI服务器。在这种部署配置中,没有必要使用ws这样的通用路径前缀。