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

如何使用动态后端服务器设置Apache2反向代理?,apache2,reverse-proxy,Apache2,Reverse Proxy,我想将Apache2设置为反向代理,使用基于名称的虚拟主机来决定如何将请求路由到后端服务器。很简单 问题在于,这些后端服务器可以动态添加和删除。我的第一个想法是以编程方式重新编写一个Apache配置文件,并在每次后端服务器启动或关闭时调用apachectl。这似乎不是正确的解决方案。实现这一目标的更好方法是什么 我需要能够优雅地将名称处理转移到不同的后端服务器。例如,Backend-Server-A可能正在处理example.com的请求。监视进程可能会决定Backend-Server-A已过时

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

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

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


更新:

我想到的唯一一件事是使用一个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
}

注意事项:这可能有一些缺陷,因为它未经测试,在添加新服务器时必须添加一个新的ProxyPassReverse(并执行一个优雅的操作),现在我考虑一下,根据应用程序的具体情况,您甚至可能不需要ProxyPassReverse行。所以,请测试一下,并告诉我们它是否有效。

您应该在serverfault上重新发布此消息,有没有可能因为交叉发布而激怒他人?在其他情况下,可能是这样,但这确实是serverfault的问题,所以我会把它作为一个新问题放在那里(不只是发布链接),因为在SF上重新发布而关闭。如果你认为这真的很有生命力,那么把它标出来,我来看看。
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