Django项目在引入异步功能后,需要ASGI服务器支撑,Daphne是官方推荐的ASGI服务器之一,在实际部署中往往需要结合传统WSGI服务,兼顾同步和异步请求的处理需求。
ASGI与WSGI的核心差异
WSGI是Python Web服务器与Web应用之间的传统接口标准,仅支持同步请求处理,无法原生支持WebSocket、服务器推送等异步场景。ASGI是WSGI的继任者,在兼容同步处理的基础上,新增了异步处理能力,支持长连接、实时通信等场景。
两者的核心差异如下表所示:
| 对比维度 | WSGI | ASGI |
|---|---|---|
| 请求处理模式 | 仅同步 | 同步+异步 |
| 支持协议 | HTTP | HTTP、WebSocket、Server-Sent Events等 |
| 适用场景 | 传统同步Django项目 | 包含异步功能、实时通信需求的Django项目 |
| 常用服务器 | Gunicorn、uWSGI | Daphne、Uvicorn |
Daphne的基本使用
Daphne是专为ASGI设计的服务器,由Django团队开发,完全兼容Django的ASGI应用。首先需要通过pip安装Daphne:
pip install daphne
安装完成后,可以通过命令行直接启动Daphne服务,假设Django项目的ASGI入口文件为project_name/asgi.py:
daphne -b 0.0.0.0 -p 8000 project_name.asgi:application
上述命令会启动Daphne服务,监听8000端口,处理所有到达该端口的HTTP和异步协议请求。
ASGI与WSGI协同部署策略
策略一:双服务分流部署
这种策略适合项目中同时存在大量同步接口和少量异步接口的场景,通过Nginx等反向代理服务器,将不同类型的请求分流到不同的服务实例。
首先需要启动两个服务:
- WSGI服务:使用Gunicorn启动同步接口服务,监听8001端口
- ASGI服务:使用Daphne启动异步接口服务,监听8002端口
Gunicorn启动命令示例:
gunicorn project_name.wsgi:application -b 127.0.0.1:8001 --workers 4
Daphne启动命令示例:
daphne -b 127.0.0.1 -p 8002 project_name.asgi:application
然后配置Nginx反向代理,将普通HTTP请求转发到8001端口,将WebSocket等异步请求转发到8002端口:
server {
listen 80;
server_name example.ipipp.com;
# 处理WebSocket等异步请求
location /ws/ {
proxy_pass http://127.0.0.1:8002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
# 处理普通HTTP同步请求
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
策略二:Daphne统一处理双协议
如果项目异步接口占比较高,或者希望简化部署架构,可以让Daphne同时处理同步和异步请求,此时不需要单独启动WSGI服务。
Daphne本身兼容WSGI应用,也可以直接运行Django的WSGI应用,不过更推荐的方式是使用Django的ASGI应用,因为ASGI应用本身可以兼容同步视图的处理。
修改asgi.py文件,确保同时兼容同步和异步处理:
import os
from django.core.asgi import get_asgi_application
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')
# 获取ASGI应用,兼容同步和异步处理
application = get_asgi_application()
此时直接启动Daphne服务即可处理所有请求:
daphne -b 0.0.0.0 -p 8000 project_name.asgi:application
如果需要提升处理能力,可以启动多个Daphne实例,配合Nginx做负载均衡:
upstream daphne_cluster {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 80;
server_name example.ipipp.com;
location / {
proxy_pass http://daphne_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket相关配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
部署注意事项
- 如果使用Daphne处理WSGI应用,部分依赖WSGI特定特性的中间件可能需要调整,建议优先使用ASGI应用模式
- 生产环境建议配合Supervisor等进程管理工具,保证Daphne和WSGI服务的稳定运行
- WebSocket等长连接场景需要注意服务器的超时配置,避免连接被意外断开
- 静态文件和媒体文件建议通过Nginx直接提供服务,不要经过Python服务器处理,提升访问效率
总结
Django项目中使用Daphne部署时,选择ASGI与WSGI的服务策略需要结合项目的实际请求类型占比。同步接口为主的项目可以采用双服务分流策略,兼顾性能和兼容性;异步接口较多的项目可以采用Daphne统一处理的策略,简化架构。无论选择哪种策略,都需要做好反向代理和进程管理,保障服务的稳定运行。