如何使用动态后端服务器设置Apache 2反向代理?

时间:2009-10-29 06:25:16

标签: apache2 reverse-proxy

我想使用基于名称的虚拟主机将Apache 2设置为反向代理,以决定如何将请求路由到后端服务器。很简单。

问题在于可以以动态方式添加和删除这些后端服务器。我的第一个想法是以编程方式重新编写Apache配置文件,并在每次后端服务器上升或下降时调用apachectl graceful。这似乎不是正确的解决方案。有什么更好的方法来实现这个目标?

我需要能够优雅地将名称处理转移到不同的后端服务器。例如,Backend-Server-A可能正在处理example.com的请求。监视进程可能会认为Backend-Server-A过时(内存使用过多,有新版本的服务器代码要处理example.com等)。监控过程启动Backend-Server-B,它将很快处理对example.com的请求。 Apache应该将对example.com的任何新请求定向到Backend-Server-B,但允许Backend-Server-A当前正在处理的任何待处理请求在Backend-Server-A关闭之前完成。

更新Posted to Server Fault

1 个答案:

答案 0 :(得分:1)

唯一想到的是使用RewriteMap脚本来决定去哪台机器,通过P标志去RewriteRule,比如

#!/usr/bin/perl
#This is /usr/bin/requestdistributor.pl
$| = 1; # Turn off buffering
while (<STDIN>) {
        print distributeRequest($_);
}
sub distributeRequest {
    my $request = shift;
    #do whatever you have to do to find the proper machine for the request,
    #return the complete URL with a trailing newline
}

然后在Apache配置文件

RewriteMap distributeRequests prg:/usr/bin/requestdistributor.pl 
RewriteRule (.*) ${distributeRequests:$1} [P]

#Setup the reverse proxying for all machines, use the proper URLs
ProxyPassReverse / http://machine1
ProxyPassReverse / http://machine2
#and so on...
ProxyPassReverse / http://machineN

警告:这可能有一些缺陷,因为它未经测试,你必须在添加新服务器时添加一个新的ProxyPassReverse(并做一个优雅的),并且,现在我考虑它,取决于具体的应用程序甚至可能不需要ProxyPassReverse行。所以,测试一下,请告诉我们它是否有效。