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

Docker部署Django Channels生产环境中WebSocket连接被拒绝问题求助

排查WebSocket连接被拒问题的步骤

1. 验证Nginx WebSocket代理配置

这是最常见的问题点,确保你的Nginx配置包含以下关键规则:

  • 正确设置连接升级头:
    location /ws/ {
        proxy_pass http://localhost:8000;  # 替换为Daphne所在的主机/容器端口
        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;
        
        # 增加长连接超时时间,避免WebSocket被过早断开
        proxy_read_timeout 86400;
        proxy_connect_timeout 7d;
    }
    
  • 确认Nginx监听443端口并正确加载Certbot证书:
    server {
        listen 443 ssl;
        server_name your-domain.com;  # 匹配Certbot证书的域名
    
        ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        
        # 其他配置...
    }
    
  • 重启Nginx后,用nginx -t验证配置语法是否正确。

2. 检查Docker网络与端口映射

  • 确认Daphne容器的端口已正确映射到EC2主机:
    运行docker ps查看Daphne容器的端口映射,比如0.0.0.0:8000->8000/tcp,确保Nginx的proxy_pass指向这个主机端口。
  • 验证Daphne容器能访问Redis容器:
    进入Daphne容器执行ping redis(假设Redis容器名为redis),或者用redis-cli -h redis ping测试连通性,确保两者在同一个Docker网络。
  • 检查EC2安全组:
    确保安全组允许外部访问443端口(wss协议使用),同时如果Nginx代理到主机的其他端口(如8000),确认主机内部能访问该端口(无需开放给外部,因为Nginx在主机内部转发)。

3. 排查Django Channels与Redis配置

  • 检查CHANNEL_LAYERS配置,确保Redis地址正确(Docker环境下用容器名而非localhost):
    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels_redis.core.RedisChannelLayer",
            "CONFIG": {
                "hosts": [("redis", 6379)],  # 这里的redis是Docker容器名,需在同一网络
                "socket_connect_timeout": 5,
                "socket_timeout": 5,
            },
        },
    }
    
  • 确认Daphne启动命令绑定了0.0.0.0,允许外部访问:
    daphne -b 0.0.0.0 -p 8000 your_project.asgi:application
    
  • 查看Redis和Daphne的日志:
    运行docker logs redis和docker logs daphne_container,检查是否有Redis连接失败、认证错误或Daphne启动异常的信息。"Event loop is closed"错误通常与Redis连接池未正确初始化或异步任务处理不当有关,可以尝试重启Redis和Daphne容器。

4. 验证前端与跨域配置

  • 确认前端wss连接地址正确,例如:
    const socket = new WebSocket('wss://your-domain.com/ws/');
    
    路径需与Nginx的location配置一致。
  • 检查Django的CORS配置(使用django-cors-headers):
    确保settings.py中包含:
    CORS_ALLOWED_ORIGINS = [
        "https://your-netlify-domain.netlify.app",  # 替换为你的Netlify域名
    ]
    CORS_ALLOW_CREDENTIALS = True
    
  • 查看浏览器控制台:
    检查是否有CORS错误、证书错误或连接超时提示,这些信息能直接定位问题。

5. 排查SSL证书问题

  • 运行certbot certificates确认证书包含你的域名,且未过期。
  • 检查Nginx的SSL协议配置,确保启用了TLS 1.2及以上版本:
    ssl_protocols TLSv1.2 TLSv1.3;
    
  • 测试wss连接:
    使用wscat工具测试连接:
    wscat -c wss://your-domain.com/ws/
    
    如果连接失败,工具会输出具体错误信息,帮助定位问题。

内容的提问来源于stack exchange,提问作者Jauhar Muhammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:55:28