正常的解决方法是调整应用程序服务器自身,将自己的身份发回自定义的http头中。
我们处于特殊情况,应用程序服务器是一个硬编码的应用程序,我们似乎无法获得新的版本。 (在apache或iis上很容易解决,我们只需将这个头添加到web服务器。)
所以问题是,nginx本身是否具有向响应中添加头的function,以通知客户端哪个服务器为请求提供服务?
注意:这不是一个正常的“浏览器到Web服务器”的情况。 这是一个自定义的客户端代码(我们有源代码,可以修改)在整体的,编译的服务器(我们没有源代码也不能修改)上运行REST API。 客户端需要知道它打的是哪个服务器,但是不需要(或者不需要)一遍又一遍地去同一台服务器(例如,cookies不是答案….没有cookie)。 客户端只需要能够在响应中看到哪个服务器服务该请求的指示。
我们的nginxconfiguration如下。 我们正在运行当前的GA版本。 我们目前正在运行nginx作为一个负载平衡器,并在Windows上。
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; }
我想,你正在寻找$upstream_addr
variables。
它将包含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; } }
是的,你使用sticky
指令。 例如:
sticky cookie srv_id expires=1h domain=.example.com path=/;
这将在客户端上设置一个cookie,并在接下来的一小时后将请求发送到正确的服务器。 这在上游指令。
资源