Eu tenho um servidor de "arquivamento" para sites antigos que não estão mais sendo usados, mas quero mantê-los on-line como parte do meu CV / Portfólio.
Eles exigem diferentes versões e configurações do apache e php, então estou executando vários apaches em diferentes portas, atrás de um proxy reverso nginx.
No entanto, não é muito frequente que esses sites tenham visitantes. Pode levar dias ou até semanas entre as visitas, então eu acho que é um grande desperdício de memória e CPU ter todas essas instâncias de apache funcionando o tempo todo.
O que eu gostaria de fazer é fazer o nginx iniciar o servidor apache apropriado sob demanda. Talvez algo assim:
- Solicitação http de entrada para o nginx.
- O nginx verifica se um servidor apache está respondendo em sua porta tcp.
- Se o apache não estiver respondendo: execute algum script para iniciar o apache.
- Quando o apache começa a responder, faça proxy reverso na solicitação http para o apache.
Eu quero que o daemon apache seja carregado com o PHP como módulo. Eu quero que a experiência seja rápida e boa quando um visitante está navegando nos sites, no entanto, alguns segundos de tempo de carregamento no primeiro pedido não é problema. Alguns dos sites são muito intensivos em AJAX, portanto, o carregamento do apache para cada solicitação não é uma opção.
Não encontro nenhuma maneira óbvia de fazer isso. Alguém tem alguma ideia ou experiência em uma configuração semelhante? Existem outros softwares de proxy reverso (que nginx) que fariam isso?
(Claro, eu também precisaria de uma maneira de desligar o apache na inatividade, mas isso é bastante simples com um cron job apenas verificando se algo aconteceu no access.log do apache.)
Btw .. O servidor está executando o Debian Lenny.
Editar / minha solução:
Eu resolvi esse problema fazendo o script com link para 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()
}
});