![负载均衡器和 Tomcat](https://linux22.com/image/687145/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E5%92%8C%20Tomcat%20.png)
目前,我们有一个 Tomcat 7 作为我们的应用服务器运行,但随着用户的增加,我们考虑以下事项,
1)放置硬件负载均衡器2)将两个 tomcat 服务器放置在负载均衡器后面的单独机器上以实现 HA。
问题
- 我们想将这两只雄猫进行集群,这会有什么缺点吗?
- tomcat之前的硬件负载均衡器是否不够用,放置apache服务器有什么好处?
- 我们想要在负载均衡器上卸载 SSL,这种方法会产生什么影响或问题?
答案1
1)我们想将这两只雄猫进行集群,这会有什么缺点吗?
主要缺点是管理服务集群更加复杂,需要大量前期投入,并且需要数据中心的更多资源。管理平衡的会话也更加复杂,否则您的客户端会在每次新请求时丢失登录名和 cookie(有关评论请参见下文)
但是,您要为此付出代价,以换取更大的容量和对故障的恢复能力。我会考虑使用某种东西来管理 tomcat 实例的配置,例如ansible或者厨师或预先构建的 Docker 容器雄猫。一开始需要做很多工作,但从长远来看,回报是丰厚的。
2)tomcat之前的硬件负载均衡器是否不够用,放置apache服务器有什么好处?
我已经很久没有使用硬件负载均衡器了,我主要转向 AWS 和云服务,所以我不能谈论运行自己的硬件负载均衡器,但是 apache 和 nginx 都很容易配置为 tomcat7 的前端代理。以前我在生产中广泛使用过 apache,有很多很好的教程可以解释其中的细微差别;
https://rvdb.wordpress.com/2012/04/26/reverse-proxying-tomcat-webapps-behind-apache/
https://wiki.apache.org/httpd/TomcatReverseProxy
使用 apache 时,您可以选择 mod_proxy 或 mod_proxy_ajp。通常,使用 http 的 mod_proxy 更容易设置,而 ajp 应该更快,因为它使用二进制格式进行通信。(但我实际上没有比较过速度)使用 mod_proxy_ajp 的另一个原因是它还会将 SSL 详细信息发送到 tomcat,因此如果您的应用程序使用 SSL 信息进行身份验证,但您已在前端传递了 HTTPS,那么您将需要 mod_proxy_ajp。
使用 apache 作为前端的另一个优点是,您可以获得所有可配置性,例如日志记录和身份验证。因此,您可以在一个地方获取两个 tomcat 服务器的聚合日志,而不必从每个节点获取日志文件。因此,您可以使用任何与 apache 配合使用的日志分析工具来为您的应用生成统计数据。
mod_proxy;
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_balancer modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
ServerName mydomain
ServerAlias *.mydomain
<Proxy balancer://mycluster>
BalancerMember http://app1.example.com:8080
BalancerMember http://app1.example.com:8080
</Proxy>
ProxyPass /test balancer://mycluster
</VirtualHost>
或使用 mod_proxy_ajp
<VirtualHost *:80>
ServerName mydomain
ServerAlias *.mydomain
<Proxy "balancer://cluster">
BalancerMember "ajp://app1.example.com:8009" loadfactor=1
BalancerMember "ajp://app2.example.com:8009" loadfactor=2
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/app" "balancer://cluster/app"
</VirtualHost>
您还必须考虑维护后端之间的会话。这取决于您的应用程序,但您通常会在 Web 应用程序中启动会话,负载平衡器会使用该 cookie 将请求路由到正确的后端;
ProxyPass "/app" "balancer://cluster/app" stickysession=JSESSIONID
这里有一些关于其如何运作的细节;
https://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#stickyness
3)我们想要在负载均衡器上卸载 SSL,这种方法会产生什么影响或问题?
我认为这是标准方法。使用证书配置 apache 比配置 tomcat 要容易得多,而且我知道 apache 处理 SSL 的效率比 tomcat 高得多(不确定 2016 年是否仍然如此...),而且这将提高性能。
我猜 tomcat 应用程序的主要问题是它位于 https:// 后面,但它不知道这一点。因此,您必须小心链接的生成方式,并确保它们正确呈现给客户端。显然,如果所有链接都与服务器相关,<a href=/my/path/to/thing.html">Click</a>
那么它应该可以正常工作。
编辑:添加了来自@tweeks200 的关于改进性能的评论