通过Nginx建立WebSocket连接返回400:不支持Hixie76协议
解决Django Channels + Elastic Beanstalk WebSocket 400错误(Hixie76协议不支持)
1. 给Daphne添加代理头信任配置
Daphne默认不会信任反向代理传递的请求头,当请求经过Nginx(及可能的Elastic Beanstalk负载均衡)转发后,需要显式告知Daphne信任这些头,否则会错误解析WebSocket请求协议。
修改docker-compose.yml中api服务的启动命令,添加--proxy-headers参数:
command: daphne myapp.asgi:application --port 8000 --bind 0.0.0.0 --proxy-headers
2. 修正Nginx的Connection头转发逻辑
当前配置硬写Connection "upgrade",不符合标准WebSocket转发逻辑,容易导致协议判断异常。
在Nginx配置的http块(或443 server块的最顶部)添加映射规则:
map $http_upgrade $connection_upgrade { default upgrade; '' close; }
然后将443 server块中的:
proxy_set_header Connection "upgrade";
替换为:
proxy_set_header Connection $connection_upgrade;
3. 检查Elastic Beanstalk负载均衡配置(若使用ALB)
如果你的环境用了Application Load Balancer:
- 把目标组的超时时间调整为300秒以上(匹配Nginx的
proxy_read_timeout) - 确保ALB不会丢弃
Upgrade和Connection请求头 - 可选开启目标组的粘性会话,提升WebSocket连接稳定性
4. 完善Django ASGI与安全配置
在myapp/asgi.py中确保正确配置WebSocket的域名验证:
import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from channels.security.websocket import AllowedHostsOriginValidator from myapp.routing import websocket_urlpatterns os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings') application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": AllowedHostsOriginValidator( URLRouter(websocket_urlpatterns) ), })
在settings.py中补充代理信任配置:
ALLOWED_HOSTS = ['my-app.com', 'localhost'] CSRF_TRUSTED_ORIGINS = ['https://my-app.com'] USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
5. 验证请求头转发情况
在settings.py中添加Daphne日志配置,查看真实收到的请求头:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': {'console': {'class': 'logging.StreamHandler'}}, 'loggers': {'daphne': {'handlers': ['console'], 'level': 'DEBUG'}}, }
部署后检查Daphne日志,确认Upgrade: websocket和Connection: Upgrade头是否正常到达。
错误原因说明
Hixie76是WebSocket的早期废弃草案,现代客户端均使用RFC6455标准。出现该错误的核心是Daphne未正确识别到标准WebSocket升级头,通常由代理层(Nginx/ELB)头转发错误,或Daphne未信任代理头导致请求被误判为过时协议版本。
内容的提问来源于stack exchange,提问作者SylvainB
相关产品推荐
相关产品推荐

