如何在AWS Ubuntu通过Nginx部署Django Channels并解决WebSocket问题
解决Django Channels + Nginx部署中WebSocket无法连接的问题
核心原因
Gunicorn是WSGI服务器,仅能处理HTTP请求,无法支持WebSocket这类ASGI协议的长连接请求。而Django Channels依赖ASGI协议,必须使用ASGI服务器(比如Daphne)来运行应用。
解决方案步骤
1. 使用Daphne启动ASGI应用
替换原Gunicorn启动命令,改用Daphne运行你的ASGI应用:
daphne app.asgi:application -b 0.0.0.0:8000
注意:命令中是
app.asgi:application而非app.wsgi,对应项目根目录下的asgi.py文件。
若需要后台运行,可配合nohup或配置systemd服务:
nohup daphne app.asgi:application -b 0.0.0.0:8000 > daphne.log 2>&1 &
2. 修改Nginx配置以支持WebSocket代理
更新Nginx配置,添加WebSocket代理所需的头部和长连接设置:
server { listen 80; server_name 52.77.215.218; location / { include proxy_params; proxy_pass http://localhost:8000/; # WebSocket相关配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 长连接超时设置,避免连接被过早断开 proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; } }
修改后重启Nginx生效:
sudo systemctl restart nginx
3. 确认Redis服务正常运行
Channels依赖Redis作为通道层,确保Redis服务处于运行状态:
# 检查Redis状态 sudo systemctl status redis-server # 若未启动则启动服务 sudo systemctl start redis-server # 设置开机自启 sudo systemctl enable redis-server
4. 验证ASGI配置正确性
确保项目根目录的asgi.py文件正确配置了Channels路由,示例如下:
import os import django from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application # 设置Django环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') django.setup() # 导入你的WebSocket路由(根据实际项目路径调整) from app.routing import websocket_urlpatterns application = ProtocolTypeRouter({ "http": get_asgi_application(), # 处理WebSocket请求 "websocket": URLRouter(websocket_urlpatterns), })
5. 测试WebSocket连接
可以使用wscat工具测试连接(需先安装Node.js):
# 安装wscat npm install -g wscat # 替换为你的WebSocket端点路径 wscat -c ws://52.77.215.218/ws/
若连接成功,会显示connected (press CTRL+C to quit),此时可发送消息测试双向通信。
内容的提问来源于stack exchange,提问作者Abdulaziz Aziz
相关产品推荐
相关产品推荐

