如果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 模块