Devo ativar o keepAlive no Apache2?

25

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 sei se o KeepAlive é adequado para mim? Onde posso encontrar bons exemplos sobre como configurar isso?

Gabriel Sosa
fonte

Respostas:

31

Já existem 2 boas respostas, mas a questão da vida real, talvez a mais importante, ainda não foi mencionada.

Primeiramente, o OP pode querer ler as 2 respostas anteriores e este pequeno post no blog para entender o que são as keepalives. (O autor não detalha a parte sobre o TCPI / IP ficar "mais rápido" quanto mais a conexão estiver aberta. É verdade que as conexões mais duradouras se beneficiam do dimensionamento da janela IP , mas o efeito não é significativo, a menos que os arquivos sejam grande ou o produto com atraso de largura de banda é extraordinariamente 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 'his' Apache atenda a outros clientes, até que o cliente feche a conexão ou o tempo limite seja atingido. No mesmo período, 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 interpretador PHP / Perl / Python, e o código do aplicativo na linguagem mencionada. Nesse caso, cada processo do Apache é "pesado" no sentido de ocupar vários megabytes de RAM (Apache vinculado ao interpretador e ao código do aplicativo). Isso, juntamente com o bloqueio de cada instância do Apache mantida em atividade, é ineficiente.

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

  • um "pesado" com mod_php (ou qualquer outra linguagem de programação usada) para conteúdo dinâmico, com keepalives desativados .
  • um "leve" com um conjunto mínimo de módulos, para veicular conteúdo estático (imagem, css, js etc.), com a função keepalives ativada .

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

  • usando um servidor orientado a eventos para conteúdo estático, como nginx .
  • usando uma CDN para conteúdo estático (poderia fazer com que todo o conteúdo estático servisse para você)
  • implementação de cache de conteúdo estático e / ou dinâmico

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

.. e muito mais. :-)

Jesper M
fonte
2
Essas respostas ainda são relevantes oito anos depois?
TheStoryCoder
Sim, ainda é relevante se você estiver usando o MPM prefork. Observe que o Apache httpd 2.4 (por exemplo, no RHEL7) usa o KeepAlive On por padrão (mas não o lista explicitamente em sua configuração - pelo menos no RHEL7).
Cameron Kerr #
5

Keepalives pode ser bom em alguns casos, pode ser muito ruim em outros. Eles reduzem o tempo e o esforço de configurar uma nova conexão, mas vinculam os recursos do servidor durante o tempo limite da manutenção permanente. Exemplos:

  • Páginas com muitos objetos pequenos, clientes em manutenção de discagem devem estar ativados.
  • Páginas com alguns objetos grandes - a manutenção da atividade não será uma vantagem.
  • Servidor com número muito alto de visitantes únicos - o keepalive deve estar desativado (caso contrário, soquetes e threads ficarão na memória aguardando o tempo limite do keepalive e não atendendo novos clientes).

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

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

Max Alginin
fonte
0

Você definitivamente deve usar o KeepAlive On.

Vejo:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

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, possam ser atendidos pelo mesmo servidor, uma conexão KeepAlive oferece um enorme aumento no desempenho, pois o navegador não precisará estabelecer uma nova conexão TCP.

Um navegador normalmente abre cerca 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, ele 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 de qualquer maneira.

Yves Junqueira
fonte
Isso é apenas da consideração do lado do cliente, embora eu suponha que o uso de recursos do servidor também seja importante.
Morgan Cheng
O uso de recursos no servidor é mais importante do que a latência percebida pelo usuário?
Yves Junqueira
1
Também acredito em ativar o KeepAlive, no entanto, o tempo limite padrão de 15 segundos do Apache é muito generoso, pois mantém os processos bloqueados por muito tempo. Normalmente, defino o tempo limite para cerca de 2 segundos, o que resulta no KeepAlive sendo usado durante cerca de um carregamento de página.
Martijn Heemels