对此的正常解决方案是调整应用服务器本身,以便将其身份发送回自定义 http 标头。
我们处于一种特殊情况,即应用服务器是一个硬编码应用程序,我们似乎无法获得它的新版本来执行此操作。 (在 apache 或 iis 上,这很容易解决,我们只需将标头添加到 Web 服务器即可。)
所以问题是,nginx 本身是否具有向响应添加标头的功能,以告知客户端哪个服务器为该请求提供服务?
注意:这不是正常的“浏览器到 Web 服务器”情况。这是一段自定义的客户端代码(我们有源代码,可以修改),在单片、编译的服务器(我们没有源代码,无法修改)上访问 REST API。客户端需要知道它访问的是哪个服务器,但不需要(或不想)一遍又一遍地访问同一个服务器(例如,cookie 不是答案……没有 cookie)。客户端只需要能够在响应中看到哪个服务器处理了该请求的指示。
我们的 nginx 配置如下。我们正在运行当前的 GA 版本。我们目前在 Windows 上运行 nginx 仅作为负载平衡器。
upstream appserver {
least_conn;
server 192.168.104.53:1124; // these are the IPs and ports of actual app servers
server 192.168.104.51:1124;
server 192.168.104.59:1124;
}
server {
listen 80; // this is where nginx listens
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://appserver;
}
答案1
我想你正在寻找$upstream_addr
多变的。
它将包含其中之一192.168.104.xx:1124
。
upstream appserver {
least_conn;
server 192.168.104.53:1124;
server 192.168.104.51:1124;
server 192.168.104.59:1124;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://appserver;
add_header "X-Upstream-Addr" $upstream_addr;
}
}
答案2
是的,您可以使用该sticky
指令。例如:
sticky cookie srv_id expires=1h domain=.example.com path=/;
这会在客户端上设置一个 cookie,并且在接下来的一个小时内,后续请求将发送到正确的服务器。这包含在上游指令中。