我面临着关于粘性会话的Apache mod_proxy_balancer的一些问题.
我们在Java上开发了一个在Tomcat上运行的restful webservice.实际的后端使用Acegi安全性,使用Auth Basic身份验证.
架构是(抱歉,我是新用户,我无法发布图片):
--------------------
|Java Reverse Proxy|
--------------------
|
--------------------
|Apache load balancer|
--------------------
|
--------|--------
| |
-------- --------
|tomcat1| |tomcat2|
-------- --------
Run Code Online (Sandbox Code Playgroud)
我们有这个"Java反向代理"来执行各种业务.它还在Tomcat(Tomcat1,Tomcat2)上执行基本身份验证.
最终用户调用以下URL:http:/// a/b?username = foo&password = bar&session = xxx
然后,反向代理将请求代理到Apache,并将凭据作为Basic Auth令牌发送.
最终用户有三个不同的网址:
http://<java reverse proxy domain>/service1
http://<java reverse proxy domain>/service2
http://<java reverse proxy domain>/service3
Run Code Online (Sandbox Code Playgroud)
只有service1和service2受Acegi保护.service3是匿名访问的(这是一项要求).
我们在Apache中有以下配置来执行负载平衡:
<Proxy balancer://cluster>
Header set Cache-Control no-cache
Header set Pragma no-cache
BalancerMember http://xxx:9671 route=server1
BalancerMember http://xxx:9672 route=server2
</Proxy>
ProxyPreserveHost On
ProxyPass / balancer://cluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://cluster/ stickysession=JSESSIONID …Run Code Online (Sandbox Code Playgroud) 我使用mod_proxy_balancer来管理后端服务器的故障转移.后端服务器可能会返回错误代码,而不是在某些其他后端服务失败时(例如NFS)超时,我们希望此类服务器也被标记为失败的节点.因此我们使用failonstatus指令.
<Proxy balancer://avatar>
ProxySet failonstatus=503
BalancerMember http://active/ retry=30
# the hot standby
BalancerMember http://standby/ status=+H retry=0
</Proxy>
Run Code Online (Sandbox Code Playgroud)
目前,故障转移与一个故障完美配合.当活动节点发生故障时,用户会收到503错误,并且从下一个请求中,备用服务器将接管.
我甚至不希望一个请求失败.无法将mod_proxy故障转移到客户端并返回错误?如果活动节点出现故障,我希望mod_proxy为同一个请求尝试待机,而不仅仅是后续请求!
我在我的Ubuntu 14.04中使用php-fpm 5.5.9配置Apache 2.4.9.我想要的是为php-fpm请求制作一个平衡器,但它会抛出以下错误:
AH01071: Got error 'Primary script unknown\n'
当我尝试访问我的PHP文件.似乎代理平衡器不会抓取ProxyPassMatch传递给它的文档根目录.我正在使用UDS使apache访问php-fpm套接字而不是使用网络tcp.
如果我配置它没有平衡器,一切正常.
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/var/run/php5-fpm.sock1|fcgi://./var/www/html
Run Code Online (Sandbox Code Playgroud)
ProxyPassMatch ^/(.*\.php(/.*)?)$ balancer://localhost/var/www/html
<Proxy balancer://localhost/>
BalancerMember unix:/var/run/php5-fpm.sock1|fcgi://localhost:9001
BalancerMember unix:/var/run/php5-fpm.sock2|fcgi://localhost:9002
BalancerMember unix:/var/run/php5-fpm.sock3|fcgi://localhost:9003
BalancerMember unix:/var/run/php5-fpm.sock4|fcgi://localhost:9004
</Proxy>
Run Code Online (Sandbox Code Playgroud)
这是平衡器的配置日志:
[Sun Jun 15 12:32:30.839726 2014] [authz_core:debug] [pid 12217:tid 140330025703168] mod_authz_core.c(828): [client 10.1.1.2:52526] AH01628: authorization result: granted (no directives)
[Sun Jun 15 12:32:30.839899 2014] [lbmethod_byrequests:debug] [pid 12217:tid 140330025703168] mod_lbmethod_byrequests.c(97): AH01207: proxy: Entering byrequests for BALANCER (balancer://localhost)
[Sun Jun 15 12:32:30.839915 2014] [lbmethod_byrequests:debug] [pid 12217:tid 140330025703168] mod_lbmethod_byrequests.c(144): AH01208: proxy: byrequests …Run Code Online (Sandbox Code Playgroud) 我确定这是一个FAQ,但我找不到任何我认为是同一个问题的东西.
我在Tomcat中运行了几个web应用程序,其中一些页面例如由SSL保护的登录页面,由web.xmls中的机密性元素定义.其中一个应用程序还通过证书接受客户端身份验证.我还有一个相当广泛的基于JAAS的授权和认证方案,各种webapps之间有各种共享代码和不同的JAAS配置等.
在完成下面的任务时,我真的不想打扰任何一个.
我现在正在添加更多Tomcat实例之前,在Tomcat之前插入带有mod-proxy和mod-proxy-balancer的Apache HTTPD作为负载均衡器.
我想要为HTTPS请求完成的是,它们被"盲目"重定向到Tomcat而没有HTTPD作为SSL端点,即HTTPD只是将密文直接传递给Tomcat,以便TC可以继续执行它已经在使用登录,SSL,Web做的事情.xml保密,最重要的是客户端身份验证.
这可能与我描述的配置有关吗?
我对webapps以及SSL和HTTPS以及Tomcat非常熟悉,但我对Apache HTTPD外围的了解有限.
很高兴在必要时移动它,但它是一种使用配置文件进行编程;)