我正在使用 Apache 的代理平衡器将一个子域(例如 subdomain.domain.com)平衡到位于 2 台服务器上的应用程序。以下是我的 Apache 配置文件的摘录:
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Proxy balancer://cluster1>
BalancerMember http://server1:28081 route=w1
BalancerMember http://server2:28082 route=w2
</Proxy>
ProxyPass /path balancer://cluster1/path
ProxyPassReverse /path balancer://cluster1/path
我的问题是,是否可以根据源 IP 地址来决定BalancerMember
应该使用哪个请求?例如1.2.3.4 向成员 1 提出的请求?
答案1
不会。代理平衡器模块将仅根据两个因素将请求传递给成员:
- 如果请求中有一个指定成员的粘性 cookie,则请求将被转发给该成员(如果可用)。看起来你不要但已进行了此配置。
- 否则请求将根据分发算法转发。有三种可配置算法,分别是简单循环、最少流量(字节)和最少请求(均有权重可用)。
您可以通过 cookie 启用粘性会话。具体如何操作可能取决于您的后端,除非您希望 Apache 不管后端在做什么都添加另一个 cookie。
附注: HAProxy,乌贼, 和Nginx都非常适合负载平衡和缓存。Apache 的代理模块通常足以应付轻负载和中等负载,听起来你已经很熟悉它了。Apache 的缺点是它就像一把瑞士军刀:做所有事情都还算不错,但做任何事都不是特别好,而且有点笨重。使用地址冗余系统,如鲤鱼将允许 Linux 或 BSD 盒也成为高可用性代理平衡器。
答案2
您可以尝试以下配置:
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Proxy balancer://cluster1>
BalancerMember http://server1:28081 route=w1
</Proxy>
<Proxy balancer://cluster2>
BalancerMember http://server2:28082 route=w2
</Proxy>
RewriteEngine On
# redirect clients from 1.2.3.4 to the first member
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4$
RewriteRule ^/path(.*)$ balancer://cluster1/path$1 [P,L]
# This rule will take care of the rest clients
ProxyPass /path balancer://cluster2/path
ProxyPassReverse /path balancer://cluster2/path