Apache Httpd 被用作两个端点服务器之间的负载平衡器。每个服务器都有自己的 HTTP 身份验证。目标是将端点身份验证传递给用户,用户输入其凭据,然后将身份验证传回端点服务器。
当我将 Apache 设置为反向代理时,身份验证顺利通过。当我转到 localhost 时,系统会提示我输入凭据,我输入凭据后,网站便正常运行。以下是我的反向代理配置:
<VirtualHost *:80>
ProxyPass "/" "http://serv123:27001/"
ProxyPassReverse "/" "http://serv123:27001/"
<Location "/">
SetEnv proxy-chain-auth On
</Location>
</VirtualHost>
但是,当我添加负载平衡时,似乎 proxy-chain-auth 配置不正确。当我输入凭据时,我立即再次收到提示,就好像它们没有正确输入一样。
<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 进行身份验证的正确方法吗?
答案1
在这个平衡构造中,每个请求都可能(并且很可能会)由另一个服务器应答,因此包含 sessionid 的浏览器 cookie 在每个请求登录序列上都被覆盖,并且会话似乎总是无效的。
有多种方法可以解决这个问题:
如果使用
stickysessions
是一种选择,您可以使用这个简单的系统来确保用户始终由同一台服务器处理(只要服务器处于活动状态并且 cookie 有效)。缺点是:当服务器死机时,用户必须再次登录。 https://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#stickyness如果完全不可能丢失会话,则应确保两台服务器上的应用程序始终知道所有登录/会话。因此,您可以使用数据库后端(甚至将这些信息以文件形式保存到中央存储中)来保存它们,并根据这些数据库保存的会话验证每个请求。缺点是每隔一个请求就切换服务器会降低服务器端缓存的效率。
结合两种尝试以实现高效缓存:后续请求始终由同一台服务器处理(粘性会话),当一台服务器发生故障时,另一台服务器将接管并从会话后端重建会话。只要您不使用共享 memcached 或类似方法,此时就必须重新进行缓存。