nginx可通过反向代理透传websocket连接,需在upgrade阶段用auth_request拦截校验,并透传authorization或x-user-id等头;必须设proxy_http_version 1.1,显式设置upgrade和connection头,谨慎处理cookie与origin头。

Nginx 本身不解析 WebSocket 协议,但可通过反向代理透传连接。关键在于:在升级(Upgrade)阶段完成身份验证,并将用户凭证安全地转发给后端服务。
利用 $http_authorization 提取并透传认证头
WebSocket 连接建立时,浏览器会发送标准 HTTP 请求(含 Upgrade: websocket),其中可能携带 Authorization 或自定义认证头(如 X-User-ID、X-Token)。Nginx 可直接捕获并透传:
- 使用 $http_authorization 获取原始 Authorization 头(如 Bearer token)
- 用 $http_x_user_id 等变量提取自定义头,避免与标准头冲突
- 通过 proxy_set_header 指令原样或改写后转发,例如:
proxy_set_header X-Forwarded-User $http_x_user_id;
在 upgrade 阶段拦截并校验(需配合 auth_request)
单纯透传不够——必须在 WebSocket 握手前完成鉴权。Nginx 的 auth_request 指令可实现此目标:
- 配置一个内部鉴权子请求(如指向 /auth-api),由后端服务返回 200 表示合法,401/403 拒绝
- 该子请求能访问到原始请求头(包括 Authorization),可用于校验 token 或 session
- 注意:auth_request 仅作用于初始 HTTP 请求,不影响后续 WebSocket 数据帧
正确设置 proxy_http_version 与 upgrade 头
WebSocket 依赖 HTTP/1.1 和 Connection: Upgrade 协议切换。Nginx 必须显式启用:
- 设置 proxy_http_version 1.1,否则默认为 1.0,无法支持 Upgrade
- 显式透传 Upgrade 和 Connection 头:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; - Connection 头值必须为字符串 "upgrade"(带引号),不能是变量,否则 Nginx 会忽略
避免 cookie 泄露与跨域干扰
若前端通过 cookie 认证,需谨慎处理:
- 默认 proxy_cookie_flags 不会转发 Secure/HttpOnly 标志,建议显式清除或重设:
proxy_cookie_flags ~ secure httponly; - 跨域场景下,Origin 头可能被浏览器自动添加,后端需校验 Origin 是否可信,Nginx 不应擅自修改或删除它
- 如需透传 Cookie,确保 proxy_pass 目标域名与 Cookie domain 匹配,否则浏览器不发送











