2009-10-29 83 views
1

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

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

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

更新Posted to Server Fault

+0

您应该在服务器默认情况下重新发布此服务 – Alex 2009-10-29 06:28:50

+0

任何通过交叉发帖刺激人的风险? – bvanderveen 2009-10-29 06:31:25

+0

在其他情况下,可能,但这真的是一个serverfault的问题,所以我只是把它作为一个新的问题在那里(不只是发布一个链接) – Alex 2009-10-29 06:34:17

回答

1

,想到的唯一的事情就是使用一个RewriteMap指令脚本,这将决定去哪个机器,通过P标志重写规则,像

#!/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行的应用程序的具体情况。所以,测试这个,请告诉我们它是否工作(或不)。