Django WebSocket本地正常生产环境连接失败(Daphne部署)
解决Django Channels WebSocket公网部署连接失败问题
针对本地正常、公网无法建立WebSocket连接的情况,按以下步骤排查修复:
1. 修复WebSocket协议适配(HTTPS环境必须改)
公网部署如果用HTTPS(生产环境基本都是),浏览器会阻止ws://明文连接,必须改用加密的wss://协议。修改前端代码:
// 自动适配协议:http对应ws,https对应wss let protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; let urls = `${protocol}//${window.location.host}/ws/socket-server/`; const Wsocket = new WebSocket(urls); Wsocket.onmessage = function (e) { let data = JSON.parse(e.data); console.log(data); }
2. 修正WebSocket路由匹配规则
你的routing.py正则未匹配路径结尾,可能导致请求路径不匹配。修改为:
# routing.py from django.urls import re_path import consumers websocket_urlpatterns = [ # 加$确保精确匹配,和前端请求路径的结尾斜杠保持一致 re_path(r'ws/socket-server/$', consumers.SocketConsumer.as_asgi()) ]
3. 生产环境替换InMemoryChannelLayer
InMemoryChannelLayer仅适合本地开发,生产环境多进程/多实例部署会导致通道层失效,甚至无法建立连接。换成Redis作为通道层:
先安装依赖:
pip install channels_redis
再修改settings.py:
# settings.py CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [("127.0.0.1", 6379)], # 对应你的Redis地址和端口 }, }, }
确保Redis服务在生产服务器上正常运行。
4. 配置反向代理(Nginx示例)
公网部署通常用Nginx做反向代理,需配置WebSocket转发规则避免连接被阻断。在Nginx的server块中添加:
server { # 已有HTTPS/HTTP配置... # WebSocket转发配置 location /ws/ { proxy_pass http://127.0.0.1:8000; # 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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
配置完成后重启Nginx:
sudo systemctl restart nginx
5. 检查服务器防火墙/安全组
- 确保Daphne监听的端口(默认8000)在服务器防火墙中开放,若用Nginx反向代理,需确保80/443端口对外开放。
- 云服务器安全组规则要允许对应的入站流量(WebSocket使用80/443或Daphne端口)。
6. 调整Daphne监听地址
启动Daphne时,不要仅监听localhost,需监听0.0.0.0才能让公网访问:
daphne -b 0.0.0.0 -p 8000 myproject.asgi:application
按以上步骤逐一排查,基本可解决公网WebSocket连接失败问题。
内容的提问来源于stack exchange,提问作者MansooR
相关产品推荐
相关产品推荐

