我在多个 Java Tomcat 实例前使用 Apache Httpd 实例作为代理。Apache 充当 Tomcat 实例的负载平衡器。
apache 配置基本上如下所示
<Proxy balancer://mycluster>
BalancerMember ajp://host1:8280 route=jvmRoute-8280
BalancerMember ajp://host2:8280 route=jvmRoute-8280
BalancerMember ajp://host3:8280 route=jvmRoute-8280
</Proxy>
<VirtualHost *:80>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
当在 Tomcat 实例中配置 AJP 端口时,这基本上可以工作。请求被发送到其中一台主机,负载分布在 Tomcat 实例中。
但是,我看到每当其中一台主机不可用时,似乎在 Httpd 内部造成了很长的延迟,即 Apache 似乎不记得其中一台主机不可用,并且反复尝试将请求也发送到丢失的主机而不是将其发送到可用的主机之一,并在稍后的某个时间尝试失败的主机。
有没有办法配置 mod_proxy 等。从 Apache Httpd 支持这样的故障转移场景,即拥有多个主机并且在一个主机发生故障时不会造成巨大的延迟?最好 Apache 应该定期在后台检查哪些主机已经消失,而不是任何请求。
我确实发现HAProxy似乎更适合这种事情,但出于一些不相关的原因,我更愿意坚持使用 Apache。
更新
与此同时,我发现我的部分问题是由客户端造成的,客户端使连接无休止地打开,因此没有更多的连接/线程可用。
因此,我将问题更改为:您将使用哪些配置选项来最大程度地减少此类事情的影响?即在这种情况下允许许多打开的连接还是快速关闭它们?否则这听起来像我当前配置的一个非常简单的 DOS 攻击?