nginx 作为负载均衡器:它能否返回给客户端请求被发送到哪个应用服务器?

nginx 作为负载均衡器:它能否返回给客户端请求被发送到哪个应用服务器?

对此的正常解决方案是调整应用服务器本身,以便将其身份发送回自定义 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,并且在接下来的一个小时内,后续请求将发送到正确的服务器。这包含在上游指令中。

来源

相关内容