Django聊天应用生产环境部署后WebSocket连接失败问题咨询
Django聊天应用WebSocket部署报错排查方案
问题根因
- 路径匹配不一致:当前WebSocket请求地址为
wss://site.com/messages/user,但Nginx配置中仅对/ws/前缀的请求做了WebSocket升级代理,该请求未匹配到对应规则,Nginx不会将其转发到后端Django Channels服务,直接导致连接失败。 - 开发环境无Nginx反向代理,请求直接到达Django服务因此可以正常运行,生产环境新增Nginx层后规则不匹配,才触发报错。
解决方法
可任选以下一种方案适配:
方案1:调整前端WebSocket请求路径(推荐)
修改前端JS代码,给WebSocket请求路径统一增加/ws/前缀,和现有Nginx配置匹配:
<script src="https://cdnjs.cloudflare.com/ajax/libs/reconnecting-websocket/1.0.0/reconnecting-websocket.min.js" integrity="anonymous"></script> var loc = window.location var wsStart = 'ws://' if (loc.protocol == 'https:'){ wsStart = 'wss://' } // 新增/ws前缀匹配Nginx规则 var endpoint = wsStart + loc.host + '/ws' + loc.pathname var socket = new ReconnectingWebSocket(endpoint)
修改后同步调整Django Channels的路由配置,匹配带/ws/前缀的路径即可。
方案2:修改Nginx代理规则适配现有路径
如果不需要统一路径规范,可直接修改Nginx配置,让/messages/前缀的请求也走WebSocket代理:
location /messages/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; proxy_pass http://127.0.0.1:8001; }
验证步骤
修改完成后执行nginx -s reload重载Nginx配置,刷新页面重新测试WebSocket连接即可。如果仍有报错可排查两个常见配置项:
- 确认后端Django Channels服务(daphne/uvicorn等)正常监听在
127.0.0.1:8001端口 - 确认Django配置文件中
ALLOWED_HOSTS包含域名site.com,Channels路由和请求路径匹配
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

