如何让 nginx 理解 cookie 值中的点?

如何让 nginx 理解 cookie 值中的点?

我将 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 测试

相关内容