我有一个“存档”服务器,用于存储不再使用的旧网站,但我想将它们作为我的简历/作品集的一部分保留在网上。
它们需要不同的 apache 和 php 版本和设置,所以我在 nginx 反向代理后面的不同端口上运行多个 apache。
但是这些站点的访客并不多,每次访问之间可能要隔几天甚至几周的时间,所以我认为让所有这些 Apache 实例一直运行会浪费大量的内存和 CPU。
我想做的是让 nginx 根据需要启动适当的 apache 服务器。可能是这样的:
- 传入 nginx 的 http 请求。
- nginx 检查 apache 服务器是否在其 tcp 端口上响应。
- 如果 apache 没有响应:运行一些脚本来启动 apache。
- 当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()
}
});
答案1
另一种方法可能是通过脚本调用来启动 apache,该脚本调用定义在inetd配置文件。
本文详细介绍了这种方法按需启动 Lighttpd,尽管面向 Lighttpd,但可能也适用于您的 apache 版本。
上述文章包含用于根据给定端口启动 Lighttpd Web 服务器的脚本,其中 lighttpd 可能需要替换为 apachectl。它还详细介绍了如何自动关闭它,以便它不会永远运行。
如果这种方法适用于您的情况,您可以考虑将您的 inetd.conf 配置行和脚本添加到您的帖子中,以供将来的读者阅读。
答案2
您可以通过 inetd (或 xinetd) 运行 apache。请参阅 apache 配置文档中的 ServerType 指令。
通过 inetd 运行 TCP 服务时,您将为每个请求启动一个进程。因此,当没有请求时,就没有 apache 进程。inetd 可以监听所有适当的端口。