O nginx pode iniciar o apache sob demanda?

1

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:

  1. Solicitação http de entrada para o nginx.
  2. O nginx verifica se um servidor apache está respondendo em sua porta tcp.
  3. Se o apache não estiver respondendo: execute algum script para iniciar o apache.
  4. 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()
  }
});
    
por Alfred Godoy 19.04.2012 / 14:41

2 respostas

4

Uma abordagem alternativa pode ser iniciar o apache por meio de uma chamada de script definida em inetd.conf .

Esta abordagem está detalhada no artigo Iniciando o Lighttpd sob demanda , que, embora seja orientado pelo Lighttpd, pode ser feita para se aplicar à sua versão do apache.

O artigo acima contém o script para iniciar o servidor da Web Lighttpd em referência a uma determinada porta, onde o lighttpd provavelmente precisa ser substituído pelo apachectl. Ele também detalha algumas idéias sobre como ele também pode ser desligado automaticamente para que ele não permaneça funcionando para sempre.

Se essa abordagem for aplicável ao seu caso, você pode considerar adicionar sua linha de configuração e scripts inetd.conf à sua postagem para futuros leitores.

    
por 22.04.2012 / 11:07
1

Você pode executar o apache via inetd (ou xinetd). Veja a diretiva ServerType nos documentos de configuração do apache.

Ao executar um serviço TCP via inetd, você iniciará um processo por solicitação. Portanto, quando não há solicitações, não há processos do apache. O inetd pode escutar em todas as portas apropriadas.

    
por 22.04.2012 / 04:56