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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:36:12