我在一台机器上运行 apache 作为负载均衡器:
<VirtualHost *:443>
ServerName ssl.example.com
DocumentRoot /home/example/public
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/example.crt
SSLCertificateKeyFile /etc/pki/tls/private/example.key
<Proxy balancer://myappcluster>
BalancerMember http://app1.example.com:12345 route=app1
BalancerMember http://app2.example.com:12345 route=app2
</Proxy>
ProxyPass / balancer://myappcluster/ stickysession=_myapp_session
ProxyPassReverse / balancer://myappcluster/
</VirtualHost>
请注意,平衡器在 SSL 端口 443 下接收请求,但随后在非 SSL 端口上与平衡器成员通信。是否可以在 SSL 下转发到平衡器成员?
如果是这样,这是最佳/推荐的方式吗?
如果是这样,我是否必须为每个平衡器成员提供另一个 SSL 证书?
该SSLProxyEngine
指令与此有关系吗?
答案1
是的,您走对了路。您需要在后端设备上设置 SSL 侦听器。
您将需要它们的证书,但可能只是自签名的证书 - 除非您设置命令SSLProxyVerify
,否则 Apache 并不关心对它们进行身份验证(当然,如果您选择,您可以让它进行验证)
是的,设置一个SSLProxyEngine on
,并将您的ProxyPass
指令更改为https
和正确的新端口。
答案2
您不想这样做。您的 Apache HTTPD 平衡器应与 Tomcat 在同一 LAN 中运行,因此不需要 SSL,而且无论如何,Apache HTTP 必须是客户端的 SSL 端点,也是 Tomcat 的受信任 SSL 端点。第二部分毫无意义。
您可以配置 Apache HTTPD SSL,以便通过 AJP 传递客户端证书等,这样您的 web 应用程序实际上就无法分辨它不是 SSL,并且您可以在 Apache HTTPD 中自定义 SSL 到目录级别的程度使其成为处理 SSL 配置的更好的地方。
答案3
我发现,如果将 SSL 与非 SSL Tomcat 进行平衡,那么 Tomcat 应用程序会将其基础设置为非 SSL URL,这似乎会导致 SSL 和非 SSL 内容混合出现问题。将 SSL 传递给 SSL Tomcat 可以正常工作。