Apache Httpd被用作两个端点服务器之间的负载平衡器。 每个服务器都有自己的HTTPauthentication。 目标是将端点身份validation传递给用户,用户input其凭据,并将身份validation传回到terminal服务器。
当我将Apache设置为反向代理时,身份validation将毫无问题地通过。 当我到本地主机,我得到提示凭据,我input他们,然后网站工作正常。 这是我的反向代理的configuration:
<VirtualHost *:80> ProxyPass "/" "http://serv123:27001/" ProxyPassReverse "/" "http://serv123:27001/" <Location "/"> SetEnv proxy-chain-auth On </Location> </VirtualHost>
但是,当我添加负载平衡,似乎proxy-chain-authconfiguration不正确。 当我input凭据时,我立即得到提示,好像他们没有正确input。
<VirtualHost *:80> ProxyPass "/" "balancer://mycluster/" ProxyPassReverse "/" "balancer://mycluster/" <Location "/"> SetEnv proxy-chain-auth On </Location> <Proxy "balancer://mycluster"> BalancerMember "http://serv123:27001/" BalancerMember "http://serv456:27001/" </Proxy> </VirtualHost>
我也尝试过<Location "balancer://mycluster">和<Location "balancer://mycluster/"> ,但没有成功。 有谁知道正确的方式通过负载平衡的Apache Httpd身份validation?
在这个平衡结构中,每个请求可能(也很可能会)被另一个服务器回答,所以包含sessionid的浏览器cookie在每个请求 – login序列上被覆盖,并且会话似乎总是无效的。
有多种方法可以解决此问题:
如果使用stickysessions是一个选项,你可以使用这个简单的系统来确保用户总是由同一个服务器处理(只要它是活着的,cookie是有效的)。 缺点是:当服务器死亡时,用户必须重新login。 https://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#stickyness
如果失去一个会话是完全不可能的,你应该确保这两个服务器上的应用程序总是知道所有login/会话。 因此,您可以使用数据库后端(或者甚至将这些信息保存为文件的中央存储)以保存它们,并validation每个请求对这些db-saved-sessions的要求。 缺点是切换服务器每隔一个请求就会导致服务器端caching效率下降。
组合两种尝试来允许有效的caching:随后的请求总是由相同的服务器(粘滞会话)处理,并且当一个服务器失败时另一个服务器从会话后端接pipe并重build会话。 只要您不使用共享的memcached或类似的方法,caching必须重做。