我将 Nginx 配置为一个简单的粘性 LB。配置的关键部分之一是将 cookie 值与服务器地址进行匹配。这很有效:
map $cookie_sessionServer $http_sticky_backend {
default 0;
Server_A 192.168.73.210:1337;
Server_B 192.168.73.210:1338;
}
现在我必须在 cookie 值中添加点(为什么是另一回事)。但是当我更改配置时,它停止工作。
map $cookie_sessionServer $http_sticky_backend {
default 0;
.Server_A 192.168.73.210:1337;
.Server_B 192.168.73.210:1338;
}
没有错误,调试日志中没有任何有用的信息,该映射只是“返回”默认值(0)并且跳过粘性逻辑。
我也尝试 过
\.Server_A 192.168.73.210:1337;
并且
".Server_A" 192.168.73.210:1337;
并且
~^\.Server_A$ 192.168.73.210:1337;
~\.Server_A$ 192.168.73.210:1337;
但这些对我都不起作用=(
答案1
如果您想使用粘性会话,可以使用替代模块来避免 nginx plus 商业实现:
您需要重新编译 nginx,但这并不难。
您还可以使用引擎,一个 nginx 开源分支,也实现了粘性会话。
如果你确实想这样做,当 cookie 丢失时,你将失去负载平衡的优势除非你编写丑陋的 if 块来捕获此异常。此外,如果你使用和设置上游max_fails
检查fail_timeout
你将失去上游状态池优势,并最终尝试将请求转发到出现故障的服务器。
为了记录,你可以这样做部分工作(考虑我刚才所说的)使用 map 指令:
map $cookie_sessionServer $route {
default 0;
"~\.Server_A$" 192.168.73.210:1337;
"~\.Server_B$" 192.168.73.210:1338;
}
server {
[ ... ]
location /foo {
proxy_pass http://$route;
}
}
使用 nginx 1.6.2 测试