Apache LoadBalancing:SSL/TLS 健康检查设置

Apache LoadBalancing: SSL/TLS settings for healthchecks

我正在尝试使用 apache 设置负载均衡器。与后端服务器的通信是经过 TLS 加密的。当我启用健康检查时,只要 ProxySSL* 指令设置在 VHost 级别,而不是在代理部分内,它就可以工作。 当我将它们移动到代理部分时,SSL/TLS 设置不再被正确评估(与后端的连接使用默认的 SSL/TLS 设置,而不是指定的设置)。但是根据 documentation,应该可以在 Proxy 部分定义 SSL/TSL 设置,这应该允许为不同的 LoadBalancer 设置 不同的 SSL/TLS 设置].

什么有效:

  <VHost ...>
    SSLProxyEngine on
    ProxyPass "/"  "balancer://mybalancer"
    SSLProxyProtocol [a protocol]
    SSLProxyCipherSuite  [a cipher suite]
    <Proxy balancer://mybalancer>
      BalancerMember https://www.backend1.com hcinterval=1 hcmethod=get hcuri=/healthcheck1.php
      BalancerMember https://www.backend2.com hcinterval=1 hcmethod=get hcuri=/healthcheck2.php
   </Proxy>
  </VHost>

在上面的示例中,healthchecks 以及普通请求使用指定的 Protocol 和 CipherSuite。此解决方案的问题是,我无法在具有不同 SSL/TLS 设置的同一 VHost 内创建第二个平衡器。不幸的是,这正是我所需要的。

什么不起作用:

<VHost ...>
    SSLProxyEngine on
    ProxyPass "/"  "balancer://mybalancer"
    ProxyPass "/2"  "balancer://mybalancer2"
    <Proxy balancer://mybalancer>
      SSLProxyProtocol [a protocol]
      SSLProxyCipherSuite  [a cipher suite]
      BalancerMember https://www.backend1.com hcinterval=1 hcmethod=get hcuri=/healthcheck1.php
      BalancerMember https://www.backend2.com hcinterval=1 hcmethod=get hcuri=/healthcheck2.php
   </Proxy>
    <Proxy balancer://mybalancer2>
      SSLProxyProtocol [another protocol]
      SSLProxyCipherSuite  [another cipher suite]
      BalancerMember https://www.backend3.com hcinterval=1 hcmethod=get hcuri=/healthcheck1.php
      BalancerMember https://www.backend4.com hcinterval=1 hcmethod=get hcuri=/healthcheck2.php
   </Proxy>
</VHost>

像这样,指定的协议和密码套件对健康检查没有影响,相反,两个平衡器的健康检查使用在 httpd.conf 的全局范围内指定的默认设置。

我认为为健康检查设置 SSLProtocol 和 SSLCipherSuite 是一种很常见的情况,我想知道是否有人有有效的设置,或者是否有人遇到过同样的问题。

在此先感谢您提供的任何帮助或进一步查找的提示。

感谢 yann 和 armin 在这方面的帮助。它适用于此错误报告中提供的补丁:

https://bz.apache.org/bugzilla/show_bug.cgi?id=62556#c6

(你只需要attachment 36043,另一个补丁是wrong/not!)

正如那里所讨论的那样,问题是平衡器成员的工作人员未正确初始化。 这就是为什么我们必须设置 至少一个代理参数 的原因。

如果我们像下面这样扩展上面的 Proxy balancer:// 定义,它就可以工作:(当然是在补丁之后):

<Proxy balancer://mybalancer2 lbmethod=byrequests> 

我们可以在这里取任何lb参数,我们可以很容易地将它设置为默认值。 (lbmethod=byrequests 是默认的,所以除了 worker 被正确初始化之外没有任何改变)。

上面的完整工作示例:

<VHost ...>
    SSLProxyEngine on
    ProxyPass "/"  "balancer://mybalancer"
    ProxyPass "/2"  "balancer://mybalancer2"
    <Proxy balancer://mybalancer lbmethod=byrequests>
      SSLProxyProtocol [a protocol]
      SSLProxyCipherSuite  [a cipher suite]
      BalancerMember https://www.backend1.com hcinterval=1 hcmethod=get hcuri=/healthcheck1.php
      BalancerMember https://www.backend2.com hcinterval=1 hcmethod=get hcuri=/healthcheck2.php
   </Proxy>
    <Proxy balancer://mybalancer2 lbmethod=byrequests>
      SSLProxyProtocol [another protocol]
      SSLProxyCipherSuite  [another cipher suite]
      BalancerMember https://www.backend3.com hcinterval=1 hcmethod=get hcuri=/healthcheck1.php
      BalancerMember https://www.backend4.com hcinterval=1 hcmethod=get hcuri=/healthcheck2.php
   </Proxy>
</VHost>

补丁应该包含在下一个版本中,也许是 2.4.35