You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:40:07