万能兼容配置,需要配置 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