万能兼容配置,需要配置 2 个地方

最后实现普通 HTTP 请求的 Connection 头不被修改,WebSocket 握手正常升级

http 配置段

map $http_upgrade $connection_upgrade {
    default "";            # 普通 HTTP 请求时,不设置 Connection 头
    websocket "upgrade";   # 当 Client 发起 WebSocket(Upgrade 为 “websocket”)时,输出 "upgrade"
}
$http_upgrade** 的值映射到一个新的变量 **$connection_upgrade 上,如果是普通请求(没带 Upgrade),这个变量是空值;如果是 WebSocket 请求(Upgrade: websocket),这个变量就是 "upgrade"

Server / location 段

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
把客户端请求里真实的 Upgrade 头透传给后端,把刚才 map 好的 $connection_upgrade(要么是空值,要么是 "upgrade")放到 Connection 头里

鸣谢

http://nginx.org/en/docs/http/websocket.html
最后修改:2025 年 07 月 08 日
如果觉得我的文章对你有用,请随意赞赏