Apache Httpd - 具有负载平衡的端点授权

Apache Httpd - 具有负载平衡的端点授权

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 或类似方法,此时就必须重新进行缓存。

相关内容