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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:50:02