对此的正常解决方案是调整应用程序服务器本身以将其身份发送回自定义 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;
}
Run Code Online (Sandbox Code Playgroud)
我猜,你正在寻找$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;
}
}
Run Code Online (Sandbox Code Playgroud)