如何同时运行uWSGI与ASGI部署Django实时聊天服务?
能否同时运行uWSGI(WSGI)与Daphne(ASGI)来处理Django请求?
当然可以!这其实是处理Django混合HTTP和实时Websocket请求的常见架构方案,既能保留uWSGI多worker处理高并发HTTP的优势,又能让Daphne专注处理ASGI类型的实时连接,完美解决你遇到的单worker负载过高问题。下面给你详细拆解实现步骤:
核心思路:请求分流
通过反向代理(比如Nginx)把不同类型的请求分发到对应的服务器:
- 普通HTTP请求(页面渲染、REST API等)继续交给uWSGI处理,保留你原来的10个worker配置,发挥多进程处理高并发的能力。
- Websocket和其他ASGI专属请求(比如你的实时聊天连接)交给Daphne处理,利用它的异步特性高效维护大量长连接。
具体配置步骤
1. 配置反向代理(以Nginx为例)
编辑你的Nginx站点配置文件,添加路径分流规则:
server { listen 80; server_name your-domain.com; # 处理普通HTTP请求,转发到uWSGI location / { include uwsgi_params; uwsgi_pass unix:/path/to/your/uwsgi.sock; # 或者用TCP端口,比如http://127.0.0.1:8000 } # 处理Websocket/ASGI请求,转发到Daphne location /ws/ { proxy_pass http://127.0.0.1:8001; # Daphne绑定的端口 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
注意:把/ws/替换成你项目中Websocket请求的实际前缀,uwsgi_pass的地址要和你的uWSGI配置一致。
2. 分别启动uWSGI和Daphne
启动uWSGI:保持你原来的多worker配置,比如通过ini文件启动:
uwsgi --ini your_uwsgi_config.ini你的ini文件里应该有类似
workers=10的配置,继续保留即可。启动Daphne:绑定到和Nginx配置中对应的端口(比如8001):
daphne -b 0.0.0.0 -p 8001 your_project.asgi:application这里的
your_project.asgi:application是你ASGI应用的入口路径,确保你的ASGI配置已经正确集成了Channels的路由。
3. 关键注意事项
- 通道层配置:如果需要横向扩展Daphne(比如启动多个Daphne进程),或者uWSGI进程需要和Daphne进程通信(比如给在线用户推送消息),必须配置Channels的通道层(常用Redis作为后端),这样不同进程之间可以通过通道层传递消息。
- Daphne扩展:如果单Daphne进程还是无法满足连接需求,可以启动多个Daphne实例,然后在Nginx中配置负载均衡,把
/ws/请求分发到多个Daphne端口上。 - 版本兼容性:你用的是Django 2.0.2和Channels,要确保Channels版本和Django版本兼容,Channels 2.x系列是支持Django 2.0的,避免出现兼容性问题。
这样架构下来,uWSGI和Daphne各司其职,既能处理高并发的HTTP请求,又能高效支撑实时聊天的长连接,完美解决负载过高的问题。
内容的提问来源于stack exchange,提问作者Pyvonix
相关产品推荐
相关产品推荐

