Django项目部署VPS后WebSocket连接失败问题求助
Django WebSocket部署VPS后连接失败问题排查与解决
核心问题分析
本地环境正常但VPS部署后出现WebSocket connection to wss://domain_name/ws/admin/pending/products/ failed错误,大概率是ASGI服务配置、Nginx代理规则或网络限制导致。
针对性修复方案
1. 确认ASGI服务器已正确部署
Django自带的runserver仅支持开发环境的WebSocket,生产环境必须使用专业ASGI服务器(如Daphne、Uvicorn):
- 安装Daphne:
pip install daphne - 启动服务(确保绑定0.0.0.0而非仅127.0.0.1,否则外部无法访问):
daphne -b 0.0.0.0 -p 8000 Naviguih_backend.asgi:application - 建议用systemd配置开机自启,避免服务意外中断。
2. 优化Nginx代理配置
当前Nginx的/ws/块缺少长连接超时设置,WebSocket需要持久化连接,添加以下配置:
location /ws/ { proxy_pass http://127.0.0.1:8000; 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_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; }
修改后重启Nginx:sudo systemctl restart nginx
3. 检查Django项目配置
- ALLOWED_HOSTS:确保域名被加入白名单:
# settings.py ALLOWED_HOSTS = ['domain_name', '127.0.0.1'] - CSRF验证:如果WebSocket使用了
AuthMiddlewareStack,前端请求需携带CSRF令牌。对于Admin页面,确保页面加载时已获取正确的CSRF cookie,且WebSocket请求的请求头中包含CSRF令牌(具体取决于你的前端实现)。
4. 排查网络限制
- 检查VPS防火墙(如ufw、iptables)是否允许8000端口的入站流量(若ASGI服务器监听8000):
sudo ufw allow 8000/tcp - 云服务器用户需检查安全组规则,确保443(HTTPS)和8000(ASGI)端口已开放。
5. 日志排查
- 查看Nginx错误日志:
tail -f /var/log/nginx/error.log - 查看ASGI服务器日志,确认是否有请求到达服务端,以及具体错误信息。
验证方法
先绕过Nginx直接测试ASGI服务:用工具(如wscat)连接ws://domain_name:8000/ws/admin/pending/products/,若能连接则问题出在Nginx配置;若仍失败则检查ASGI服务或Django路由。
内容的提问来源于stack exchange,提问作者KERIM AZOU
相关产品推荐
相关产品推荐

