Django项目配置SSL后wss协议WebSocket连接失败问题求助
问题排查与解决步骤
核心配置冲突点
你当前的配置存在三处明显错误,直接导致wss连接失败:
- Daphne启动时配置了SSL,8001端口仅接受wss协议请求,但Nginx的
/ws/代理是用http协议转发请求到8001,协议不匹配 - Nginx的
/ws/代理配置中proxy_pass末尾带了斜杠,会把请求路径中的/ws/前缀截断,导致Daphne匹配不到路由 - 前端直接请求8001端口的wss地址,不仅绕开了Nginx的SSL统一入口,且服务器公网通常未开放8001端口的外部访问权限
修复步骤
1. 修正Daphne服务配置
内网Nginx到Daphne的通信无需额外加密,去掉SSL配置,仅监听本地回环地址即可:
修改daphne.service的ExecStart行:
ExecStart=daphne -b 127.0.0.1 -p 8001 myproject.asgi:application
修改后执行命令重启服务:systemctl daemon-reload && systemctl restart daphne
2. 修正Nginx代理配置
补全请求头信息,移除proxy_pass末尾的斜杠,保留完整路径转发给Daphne:
location /ws/ { 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; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_pass http://127.0.0.1:8001; }
修改后执行命令重启Nginx:nginx -t && systemctl restart nginx
3. 修改前端WebSocket连接地址
不要携带8001端口,直接通过Nginx的443 SSL端口建立wss连接,地址改为:wss://www.xxx.com/ws/asdf/1234/
兜底排查方案
如果按上述步骤修改后仍连接失败,按顺序排查:
- 查看Daphne运行日志:
journalctl -u daphne -f,确认服务正常启动无报错 - 本地校验Daphne连通性:服务器执行
curl http://127.0.0.1:8001/ws/,确认有返回结果 - 查看Nginx错误日志:
tail -f /var/log/nginx/error.log,排查转发阶段的错误 - 检查Django配置:确认
ALLOWED_HOSTS包含你的站点域名,CSRF_TRUSTED_ORIGINS已配置HTTPS前缀的域名 - 校验Redis服务状态:执行
redis-cli ping确认返回PONG,Channels层可以正常连接Redis
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

