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

Django Channels聊天应用本地正常,生产环境WebSocket连接失败求助

问题解决方法

核心原因

生产环境页面通过HTTPS加载,浏览器出于安全限制,禁止从HTTPS页面发起未加密的ws://WebSocket连接,必须使用加密的wss://协议。

修复JavaScript代码

不要硬写ws://,而是根据当前页面的协议动态切换:

方法一:显式判断协议

const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
const chatSocket = new WebSocket(
  protocol
  + window.location.host
  + '/ws/chat/'
  + roomName
  + '/'
);

方法二:替换协议前缀

更简洁的写法,自动适配HTTP/HTTPS对应的WebSocket协议:

const chatSocket = new WebSocket(
  window.location.protocol.replace('http', 'ws')
  + window.location.host
  + '/ws/chat/'
  + roomName
  + '/'
);

生产环境服务器配置补充

仅修改前端代码还不够,需要确保反向代理服务器(如Nginx)正确配置WebSocket代理,将wss请求转发到Django Channels的ASGI服务。以下是Nginx配置示例(假设ASGI服务运行在127.0.0.1:8001):

location /ws/ {
    proxy_pass http://127.0.0.1:8001;
    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,确保ASGI服务正常运行,即可建立加密的WebSocket连接。

内容的提问来源于stack exchange,提问作者mohsen neptune

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:15