nginx可以根据需要启动apache吗?

我有一个旧的网站“档案”服务器,不再使用,但我想保持在线,作为我的简历/投资组合的一部分。

他们需要不同的apache和php版本和设置,所以我在不同的端口上运行多个apaches,在nginx反向代理之后。

然而,这些网站并不经常有访问者。 访问之间可能需要几天甚至几周的时间,所以我认为这是一个很大的内存和CPU的浪费,让所有这些Apache实例始终运行。

我想要做的是让nginx按需启动适当的apache服务器。 也许这样的事情:

  1. 传入http请求到nginx。
  2. nginx检查一个apache服务器是否响应它的tcp端口。
  3. 如果apache没有响应:运行一些脚本来启动apache。
  4. 当apache开始响应时,将http请求反向代理到apache。

我希望Apache的守护进程作为模块加载PHP。 当访问者浏览网站时,我希望访问速度快,但是,在第一个请求上加载几秒钟是没有问题的。 一些网站是非常强大的AJAX,所以加载Apache的每个请求不是一个选项。

我没有find任何明显的方式来做到这一点。 有没有人有类似的设置有任何想法或经验? 还有其他反向代理软件(比nginx)会这样做吗?

(当然,我也需要一种closuresapache的方式来closures不活动,但是用cron作业来检查apache的access.log中是否发生了一些事情是非常简单的。)

Btw ..服务器正在运行Debian Lenny。

编辑/我的解决scheme:

我通过https://github.com/nodejitsu/node-http-proxy为node.js编写脚本解决了这个问题。

// I'm using http-proxy to make the proxying: var server = httpProxy.createServer(function (req, res, proxy) { var domain = getDomain(req); proxy.proxyRequest(req, res, { host: '127.0.0.1', port: configuration[domain].port }); }).listen(80); // And a error handler, which will start apache on deman: server.proxy.on('proxyError', function(err, req, res) { if (err.errno == 'ECONNREFUSED') { // Start apache using exec() } }); 

另一种方法可能是通过在inetd.conf中定义的脚本调用启动apache。

在Lighttpd On Demand文章中详细介绍了这种方法,虽然Lighttpd为导向,但可能适用于您的Apache版本。

上面的文章包含启动Lighttpd Web服务器的脚本,该脚本引用给定的端口,其中lighttpd可能需要replace为apachectl。 它还详细介绍了如何自动closures的一些想法,所以它不会一直运行。

如果这种方法适用于您的情况,则可以考虑将您的inetd.confconfiguration行和脚本添加到您的post中供将来的读者使用。

你可以通过inetd(或xinetd)运行apache。 请参阅Apacheconfiguration文档中的ServerType指令。

当通过inetd运行一个TCP服务时,你将为每个请求启动一个进程。 所以当没有请求时,没有apache进程。 inetd可以监听所有相应的端口。