在DigitalOcean应用平台部署Django+Channels时WebSocket配置问题排查
问题分析与解决方案
核心问题1:前端WebSocket连接地址错误
你的前端代码硬编码了本地开发地址ws://127.0.0.1:8000/ws/waitlist/,部署到DigitalOcean后:
- 必须替换为生产环境域名,且因为DO应用平台默认使用HTTPS,WebSocket协议要改为
wss - 推荐用动态方式获取当前域名,避免硬编码:
// 自动适配ws/wss协议与当前域名 const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const wb = new WebSocket(`${protocol}//${window.location.host}/ws/waitlist/`);
核心问题2:Channels缺失Redis通道层配置
你的settings.py未配置CHANNEL_LAYERS,Daphne依赖该组件处理WebSocket消息转发,必须添加以下配置:
# 在settings.py中新增 import os CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [os.environ.get('REDIS_URL')], }, }, }
注:你的REDIS_URL使用rediss://(带SSL的Redis连接),Channels-Redis 3.4.1原生支持该格式,无需额外SSL配置。
核心问题3:验证ALLOWED_HOSTS配置
确保settings.py中的ALLOWED_HOSTS包含生产域名:
ALLOWED_HOSTS = ['blah.com', '*.blah.com']
AllowedHostsOriginValidator会校验WebSocket请求的Origin头,只有域名在ALLOWED_HOSTS或CSRF_TRUSTED_ORIGINS范围内的请求才会被通过。
额外检查:DigitalOcean应用端口配置
你的Daphne启动命令指定了-p 8080,需确认DO应用平台的端口设置(App > Settings > Ports)中,容器端口为8080,协议设置为HTTP(Daphne会自动处理WebSocket协议升级)。
内容的提问来源于stack exchange,提问作者cbirch
相关产品推荐
相关产品推荐

