Devo ativar o keepAlive no Apache2?

23

Em qualquer instalação padrão, o Apache 2 vem com o keepAlive desativado, mas olhando para outro servidor, o módulo keepAlive foi ativado.

Então, como eu sei se keepAlive é certo para mim? Onde posso encontrar alguns bons exemplos sobre como configurar isso?

    
por Gabriel Sosa 12.10.2009 / 23:55

3 respostas

30

Já existem duas boas respostas, mas o talvez problema mais importante da vida real ainda não foi mencionado.

Primeiro, o OP pode querer ler as duas respostas anteriores e este pequeno blog postar para entender o que são keepalives. (O autor não elabora na parte sobre TCPI / IP ficando "mais rápido" quanto mais tempo a conexão é aberta. É verdade, conexões mais duradouras se beneficiam de Escala da janela IP , mas o efeito não é significativo, a menos que os arquivos sejam grandes, ou o produto de atraso de largura de banda seja incomumente grande.

O grande argumento contra o HTTP Keepalive ao usar o Apache é que ele bloqueia os processos do Apache. Ou seja um cliente usando keepalives impedirá que o processo 'apache' dele sirva qualquer outro cliente, até que o cliente feche a conexão ou o tempo limite seja atingido. No mesmo período de tempo, essa instância do Apache poderia ter servido muitas outras conexões.

Agora, uma configuração muito comum do Apache é o Prefork MPM e um PHP / Perl / Interpretador de Python e código de aplicativo no idioma mencionado. Nesse caso, cada processo do Apache é "pesado", no sentido de que ocupa vários megabytes de RAM (o Apache está vinculado ao interpretador e ao código do aplicativo). Isso, junto com o bloqueio de cada instância do Apache, é ineficiente.

Uma solução alternativa é usar dois servidores Apache (ambos no mesmo servidor físico ou em dois servidores, conforme necessário) com diferentes configurações:

  • um "pesado" com mod_php (ou qualquer linguagem de programação usada) para conteúdo dinâmico, com keepalives off .
  • um "leve" com um conjunto mínimo de módulos, para servir conteúdo estático (image, css, js etc), com keepalives on .

Você pode expandir essa separação de conteúdo dinâmico e estático quando necessário , por exemplo:

  • usando um servidor controlado por eventos para conteúdo estático, como nginx .
  • usando um CDN para conteúdo estático (pode fazer todo o conteúdo estático atendendo a você)
  • implementando o armazenamento em cache de conteúdo estático e / ou dinâmico

Outra abordagem com relação a evitar o bloqueio do Apache é usar um balanceador de carga com um tratamento de conexão mais inteligente, como Perlbal .

.. e muito mais. : -)

    
por 01.11.2009 / 19:45
5

Keepalives podem ser bons em alguns casos, eles podem ser muito ruins em outros. Eles reduzem o tempo e o esforço de configurar uma nova conexão, mas atrelam os recursos do servidor durante o tempo limite de atividade. Exemplos:

  • Páginas com muitos objetos pequenos, clientes no dialup - o keepalive deve estar ativado.
  • Páginas com alguns objetos grandes - o keepalive não será uma vantagem.
  • Servidor com um número muito alto de visitantes únicos - o keepalive deve estar desativado (caso contrário, os soquetes e encadeamentos ficarão na memória aguardando o tempo limite da atividade e não atendendo a novos clientes).

Como você pode ver, o KeepAliveTimeout também terá um grande papel na otimização do desempenho do servidor.

Veja seu padrão de uso e decida por si mesmo.

    
por 15.10.2009 / 04:51
0

Você deve definitivamente usar o KeepAlive On.

Veja:

link

Dessa forma, uma única conexão TCP será reutilizada pelo navegador para enviar várias consultas. Normalmente, um site tem muitos componentes (página HTML, código javascript, imagens). Desde que esses recursos estejam no mesmo domínio, portanto, podem ser servidos pelo mesmo servidor, uma conexão KeepAlive proporciona um grande aumento no desempenho, já que o navegador não precisará estabelecer uma nova conexão TCP.

Um navegador normalmente abre em torno de três conexões paralelas a um domínio. Então, digamos que você tenha 18 objetos no seu site. O navegador abriria 3 conexões e baixaria 6 objetos em cada conexão - usando o modo KeepAlive. Sem o KeepAlive, teria que abrir 18 conexões TCP, o que é muito lento.

A maioria, ou todos os navegadores modernos são compatíveis com HTTP / 1.1, portanto, isso deve funcionar.

Certos proxies HTTP como o Squid não são compatíveis com HTTP / 1.1, mas solicitam o uso de uma conexão KeepAlive mesmo assim.

    
por 15.10.2009 / 04:34