Nginx代理WebSocket需配置HTTP/1.1、透传Upgrade和Connection头,并安全传递认证信息;支持URL参数、Authorization头或Cookie透传,亦可选配auth_request模块实现Nginx层轻量认证。

要让 Nginx 正确代理 WebSocket 连接并完成身份认证,关键在于两件事:一是保持 WebSocket 协议升级(Upgrade)请求不被破坏,二是把认证信息(如 Token、Cookie 或 Header)安全透传给后端服务。
确保 WebSocket 协议头正确转发
Nginx 默认会丢弃 Connection 和 Upgrade 请求头,而 WebSocket 建立依赖这两个头。必须显式设置才能透传:
- 添加
proxy_http_version 1.1;—— 启用 HTTP/1.1 是 Upgrade 的前提 - 设置
proxy_set_header Upgrade $http_upgrade;—— 把客户端的 Upgrade 头原样传给后端 - 设置
proxy_set_header Connection "upgrade";—— 显式告诉后端这是升级请求(注意引号不能省)
透传认证信息到后端
认证方式不同,透传方式也不同。常见做法有三种:
- 若前端通过 URL 传 Token(如
wss://example.com/ws?token=abc123),Nginx 默认会保留 query string,后端可直接解析 - 若 Token 放在
Authorization请求头中,需加proxy_set_header Authorization $http_authorization; - 若使用 Cookie 认证,Nginx 默认已透传 Cookie,但需确认未被
proxy_hide_header屏蔽,且后端信任该来源
可选:在 Nginx 层做简单认证拦截
如果不想把认证逻辑全交给后端,可在 Nginx 中做轻量级校验。例如用 map + auth_request 模块调用一个认证接口:
- 启用
auth_request模块(编译时需含--with-http_auth_request_module) - 配置一个内部 location,指向你的鉴权服务(如
/auth),返回 200 表示通过 - 在 WebSocket 的
location中加入auth_request /auth; - 注意:WebSocket 的 Upgrade 请求会被 auth_request 拦截两次(OPTIONS + GET),需确保鉴权服务能处理
完整配置示例(含认证透传)
以下是一个典型配置片段,假设后端 WebSocket 服务运行在 localhost:8080,且期望收到 Authorization 头和原始 Cookie:
location /ws/ {
proxy_pass http://localhost:8080/;
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 Authorization $http_authorization;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}


















