我想使用基于名称的虚拟主机将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关闭之前完成。
答案 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行。所以,测试一下,请告诉我们它是否有效。