如果header头定义两个变量,
需要优先采取header1 均衡到后端服务器
如果header2存在就用header2均衡到后端服务器

主要应用场景在websocket的链接分发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#map section
map $http_header2 $selectone {
~_    $http_header2;     #header2 内容是***_***匹配是否有内容
''    $http_header1;        #header2 没有内容用header1
default $http_header1;
}
#split section
split_clients "$selectone" $bkservice {
50% webserv1;
*  webserv2;
}

server {
listen 80;
server_name www.test.com;

.......

location ~ ^/balanceservice {
proxy_pass http://$bkservice;
}
......

}

两个模块前后顺序没有关系,不影响最终使用(map 指令。这些不与处理阶段相关联的配置指令基本上都是“声明性的”(declarative),即不直接产生某种动作或者过程。Nginx 的作者 Igor Sysoev 在公开场合曾不止一次地强调,Nginx 配置文件所使用的语言本质上是“声明性的”,而非“过程性的”(procedural)。)
nginx/1.15.0 的代码和实际调试运行来看 只有真正使用变量的时候才会去调用具体的变量解析逻辑。

参考资料:
agentzh的nginx教程
nginx开发从入门到精通
nginx源码分析 3张图看懂
map模块详解
split_client 模块