我想将Apache 2设置为使用基于名称的虚拟主机的反向代理来决定如何将请求路由到后端服务器。 很简单。
问题是这些后端服务器可能会以dynamic方式添加和删除。 我的第一个想法是以编程方式重新编写一个Apacheconfiguration文件,并在每次后端服务器启动或closures时调用apachectl graceful 。 这似乎不是正确的解决scheme。 什么是更好的方法来完成这个?
我需要能够适当地将名称的处理转移到不同的后端服务器。 例如,后端服务器A可能正在处理对example.com的请求。 监视过程可能会决定后端服务器A是陈旧的(内存使用量过多,有新版本的服务器代码来处理example.com等)。 监控进程启动Backend-Server-B,后者将很快处理对example.com的请求。 Apache应该将任何对example.com的新请求指向Backend-Server-B,但是允许Backend-Server-A当前正在处理的任何待处理请求在我的监控进程closuresBackend-Server-A之前完成。
( 注 :我最初发布在堆栈溢出。)
唯一想到的是使用一个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 }
然后在Apacheconfiguration文件中
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
注意事项:这可能有一些缺陷,因为它没有经过testing,当你添加一个新的服务器(并做一个优雅的),你将不得不添加一个新的ProxyPassReverse,现在我想,根据应用程序的具体细节甚至不需要ProxyPassReverse行。 所以,testing这个,请告诉我们它是否工作(或不)。
有更好的工具, 清漆是一个优秀的反向代理,可以处理后端健康检查,故障转移,负载平衡等。你可以在这里和这里find相关的文档。
这应该是对“RewriteMap”脚本的一个评论,但显然我对评论有点“毫无意义”。
如果你使用一个新的Apache版本,Vinko的build议可以通过使用RewriteMap和mod_dbd的“dbd”选项来实现,以查询一个简单的sqlite3数据库并pipe理查询过程。
尽pipe在内存查找方面没有什么不足,但是我在实时服务上使用了自动优雅重新configuration,效果相当不错,但是我想这是您的平稳重启频率以及您的apache启动时的影响问题。 我们必须避免的主要事情是基于DNS查找的任何事情(例如使用域的vhostconfiguration),因为dns查找超时可能导致延迟,并且传入队列被填满和中断,而不是短暂的暂停。
像往常一样,加载testing几个解决scheme,看看有什么不同。