instância única do apache versus várias instâncias do apache

1

Eu trabalho em um aplicativo SaaS construído com o Django (Python) e executado com o Apache / mod_wsgi.

O site de registro cria uma configuração do host virtual do apache, wsgi e arquivos de configurações. E finalmente reinicia o servidor apache.

Isso significa que toda vez que um novo usuário registra uma conta, o apache é reiniciado e isso afeta o desempenho do aplicativo para os clientes atuais.

Uma opção possível é criar uma instância separada do apache para novos clientes, já que isso aumentará muito a RAM necessária para todos os clientes.

Que recomendações você tem sobre isso?

    
por quarry32 23.11.2010 / 00:47

3 respostas

2

O efeito colateral de várias instâncias é que elas não podem ser executadas na mesma porta.

Talvez seu script possa fazer um "apachectl configtest" para garantir que a configuração seja válida primeiro (ajudando a evitar que ele seja iniciado devido a erro na configuração).

E, em seguida, execute o apachectl com graça.

apachectl gracioso : Reinicia com graça o daemon do Apache enviando-lhe um SIGUSR1. Se o daemon não estiver em execução, ele será iniciado. Isso difere de uma reinicialização normal em que as conexões atualmente abertas não são abortadas. Um efeito colateral é que os arquivos de log antigos não serão fechados imediatamente. Isso significa que, se usado em um script de rotação de log, um atraso substancial pode ser necessário para garantir que os arquivos de log antigos sejam fechados antes de processá-los. Este comando verifica automaticamente os arquivos de configuração via configtest antes de iniciar a reinicialização para garantir que o Apache não morra.

apachectl configtest : executa um teste de sintaxe do arquivo de configuração. Ele analisa os arquivos de configuração e relata o Syntax Ok ou informações detalhadas sobre o erro de sintaxe específico.

    
por 23.11.2010 / 00:56
0

Este é provavelmente um exagero, mas eu tenho um plano astuto. : -)

Configure uma regra de iptables como:

iptables -t nat -i PREROUTING -m tcp -p tcp --dport 80 -j DNAT --to-destination :81

Ter o Apache sendo executado na porta 81. As conexões de entrada da porta 80 serão redirecionadas para a porta 81.

Agora, quando você obtiver uma nova configuração, salve-a em um local separado e faça com que ela escute na porta 82. Agora você pode tentar iniciar uma segunda instância do Apache. Se não conseguir iniciar, você sabe que tem um problema de configuração e pode continuar executando com a configuração antiga até que ela seja resolvida.

Se ele for iniciado, substitua a regra iptables acima por uma apontando para a porta 82. As conexões existentes continuarão a ir para a porta antiga até que sejam concluídas. Dê a eles algum período de tolerância antes de encerrar a instância antiga. Dessa forma, você inicia uma instância completamente nova e encerra a antiga, mas sem interromper os usuários. Então você pode fazer o mesmo com a próxima configuração voltando para a porta 81.

O apachectl gracioso é provavelmente o que você quer, mas se não funcionar para você, isso pode ser outra opção.

    
por 23.11.2010 / 04:22
0

Você verá que, com o Apache / mod_wsgi, ele é version-locked para a versão do Django. Então, se você tiver o código do Python 2 com o mod_wsgi2, você terá que ter uma instância separada do httpd com mod_wsgi3 se você também tiver o código do Python 3.

Eu não sei o quão bem a partida deve ser, mas acho que me disseram para esperar ter outra instância do Apache assim que terminarmos de migrar de 2 para 3 e, em seguida, de 3.next. Adicione a isso e a outros conflitos de módulo na mesma caixa para algum outro middleware, e essa caixa tem três instâncias de httpd atualmente.

Espero que seu site seja redundante e você possa reiniciar um lado de cada vez. Você deve multiplexar entre os sites com um proxy reverso, talvez httpd com algo como mod_cluster.

E o espaço de processo dentro do mod_wsgi? Os dois clientes são isolados uns dos outros de maneira segura se forem gerenciados pela mesma instância httpd?

Se eu tivesse a escolha, eu provavelmente iria com uma implantação FastCGI .... Eu acho que o Django pode fazer isso (com gunicorn?), mas já faz algum tempo desde que nós olhamos, e eu não era o único fazendo o olhar.

Espero que ajude.

    
por 12.04.2015 / 15:15