nginx可以按需启动apache吗?

Alf*_*doy 4 debian nginx reverse-proxy apache-2.2

我有一个用于不再使用的旧网站的“存档”服务器,但我想将它们作为我的简历/作品集的一部分保持在线。

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

但是,这些网站很少有访问者。两次访问之间可能需要几天甚至几周的时间,所以我认为让所有这些 apache 实例一直运行是对内存和 CPU 的巨大浪费。

我想做的是让 nginx 按需启动相应的 apache 服务器。也许是这样的:

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

我希望 apache 守护进程以 PHP 作为模块加载。我希望访问者浏览网站时体验既快又好,但是,第一次请求的加载时间几秒钟是没有问题的。有些站点是 AJAX 密集型的,因此不能为每个请求加载 apache。

我没有找到任何明显的方法来做到这一点。有没有人对类似的设置有任何想法或经验?是否有其他反向代理软件(除了 nginx)可以做到这一点?

(当然,我还需要一种在不活动时关闭 apache 的方法,但这对于 cron 作业来说非常简单,只需检查 apache 的 access.log 中是否发生了某些事情。)

顺便说一句.. 服务器正在运行 Debian Lenny。

编辑/我的解决方案:

我通过使用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()
  }
});
Run Code Online (Sandbox Code Playgroud)

har*_*ymc 5

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

这种方法在按需启动 Lighttpd一文中有详细介绍,虽然它是面向 Lighttpd 的,但可能适用于您的 apache 版本。

上面的文章包含用于启动 Lighttpd 网络服务器的脚本,参考给定的端口,其中 lighttpd 可能需要替换为 apachectl。它还详细介绍了有关如何自动关闭以使其不会永远运行的一些想法。

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