强制Apache proxy_balancer指定给特定的worker

我想在proxy_balancer后面有两个tomcat服务器,所以我可以进行滚动部署。

我有这个工作,所以我可以取下一个tomcat,另一个采取futire请求

<Proxy balancer://production> BalancerMember http://10.10.10.111:8080 route=s1 BalancerMember http://10.10.10.112:8080 route=s2 ProxySet stickysession=ROUTEID </Proxy> ProxyPass /services balancer://production/services Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED 

我现在想要做的就是取下一台服务器,然后从平台pipe理器的池中取出。 然后,当我升级并使服务器启动并运行时 – 在返回到池之前,我希望能够访问它,以便在返回到池之前进行检查。 例如

 ProxyPass /sanity_check http://10.10.10.111:8080/services 

但这不会工作,因为服务器redirect到/服务,并通过平衡器。 我可以做一个单独的域名,但要避免这一点。

我想基于一个URL参数设置一个cookie可能工作,但很难做。 有一些function可以轻松实现吗? 例如在HAProxy我可以做到这一点

 use-server tomcat_01 if { path_end TOMCAT_01 } use-server tomcat_02 if { path_end TOMCAT_02 } 

我就是这么做的 设置3个平衡器池 – 每个单独服务器的主要一个和一个:

 <Proxy balancer://tomcat1> BalancerMember http://10.10.10.111:8080 route=t1 ProxySet stickysession=ROUTEID </Proxy> <Proxy balancer://tomcat2> BalancerMember http://10.10.10.112:8080 route=t2 ProxySet stickysession=ROUTEID </Proxy> <Proxy balancer://production> BalancerMember http://10.10.10.111:8080 route=p1 BalancerMember http://10.10.10.112:8080 route=p2 ProxySet stickysession=ROUTEID </Proxy> 

为个人服务器build立一个池可以保持一致。

route=p1用于设置cookie,以便平衡器可以使用stickysession会话关联 – 即对浏览器会话使用相同的服务器。 即使会话在服务器之间共享,这对滚动部署也很有用,因为我不希望用户击中旧版本,然后从新服务器获取.js文件等。

我将使用这个cookie来决定使用哪个池。 例如,如果ROUTEID cookie是.t1 (注意前导点 – 这显然是必要的),那么使用tomcat1平衡器。

 # Default to production pool SetEnvIf Request_URI "/" TARGET_POOL=production SetEnvIf Cookie "ROUTEID=.t1" TARGET_POOL=tomcat1 SetEnvIf Cookie "ROUTEID=.t2" TARGET_POOL=tomcat2 

一旦设置了路由cookie,会话将继续通过该后端平衡器。

我可以通过在URL的末尾附加一个标识符来select我想要使用的平衡器池,以select要用于此会话的平衡器池。

将环境variablesTARGET_POOL设置为适当的池

 SetEnvIf Request_URI "/select_tomcat1$" TARGET_POOL=tomcat1 SetEnvIf Request_URI "/select_tomcat2$" TARGET_POOL=tomcat2 SetEnvIf Request_URI "/select_pool$" TARGET_POOL=production 

现在我可以使用TARGET_POOL将请求传递给选定的后端平衡器

 ProxyPassInterpolateEnv On ProxyPass /services balancer://${TARGET_POOL}/services interpolate ProxyPassReverse /services balancer://${TARGET_POOL}/services interpolate 

请注意,要使这些variables起作用, ProxyPassInterpolateEnv On是必需的,并且每个ProxyPassProxyPassReverse需要一个interpolate

最后,我需要设置上面用于平衡器的stickysession会话亲缘关系和我select后端的cookie:

 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED