Há uma série de módulos MPM (Multi-Processing Modules), mas, de longe, o mais utilizado (pelo menos em plataformas * nix) são os três principais: prefork
, worker
, e event
. Essencialmente, eles representam a evolução do servidor da web Apache e as diferentes maneiras em que o servidor foi criado para lidar com solicitações HTTP dentro das restrições de computação do tempo ao longo de sua longa história (em termos de software).
mpm_prefork
é .. bem .. é compatível com tudo. Ele gera vários processos filhos para atender solicitações, e os processos filhos atendem apenas uma solicitação por vez. Como o processo do servidor está lá, pronto para a ação e sem a necessidade de lidar com o agrupamento de encadeamentos, é realmente mais rápido que os MPMs encadeados mais modernos quando você está lidando apenas com uma única solicitação por vez - mas as solicitações simultâneas sofrem, pois eles são feitos para esperar na fila até que um processo do servidor seja gratuito. Além disso, ao tentar aumentar a contagem de processos-filhos pré-fork, você sugará facilmente uma RAM séria.
Provavelmente não é aconselhável usar o prefork, a menos que você precise de um módulo que não seja seguro para threads.
Use if: Você precisa de módulos que quebrem quando threads são usados, como mod_php
. Mesmo assim, considere usar o FastCGI e php-fpm
.
Não use se: Seus módulos não quebram na segmentação.
mpm_worker
usa threading - o que é uma grande ajuda para a simultaneidade. O Worker gera alguns processos filhos, que, por sua vez, geram threads filhos; semelhante ao prefork, alguns threads sobressalentes são mantidos prontos, se possível, para atender às conexões de entrada. Essa abordagem é muito mais gentil na RAM, pois a contagem de threads não afeta diretamente o uso de memória, como a contagem de servidores no pré-fork. Ele também lida com a concorrência com muito mais facilidade, já que as conexões precisam apenas esperar por um encadeamento livre (que geralmente está disponível) em vez de um servidor sobressalente no prefork.
Use se: Você está no Apache 2.2 ou 2.4 e está executando principalmente SSL.
Não use se: Você realmente não pode dar errado, a menos que precise de pré-fork para compatibilidade.
No entanto, observe que os passos são anexados a conexões e não a solicitações - o que significa que uma conexão keep-alive mantém sempre um thread em espera até que ele seja fechado (o que pode levar muito tempo, dependendo da sua configuração). É por isso que temos ..
mpm_event
é muito semelhante ao trabalhador, estruturalmente; acabou de passar do status 'experimental' para 'estável' no Apache 2.4. A grande diferença é que ele usa um encadeamento dedicado para lidar com as conexões mantidas ativas, e envia solicitações para encadeamentos filhos apenas quando uma solicitação foi realmente feita (permitindo que esses encadeamentos façam backup imediatamente após a conclusão da solicitação). Isso é ótimo para a simultaneidade de clientes que não estão necessariamente ativos de cada vez, mas fazem solicitações ocasionais e quando os clientes podem ter um tempo limite longo e ativo.
A exceção aqui é com conexões SSL; nesse caso, ele se comporta de forma idêntica ao trabalhador (colando uma determinada conexão a um determinado encadeamento até que a conexão seja fechada).
Use if: Você está no Apache 2.4 e gosta de threads, mas não gosta de ter threads aguardando conexões inativas. Todo mundo gosta de tópicos!
Não use se: Você não está no Apache 2.4 ou precisa de pré-fork para compatibilidade.
No mundo atual de slowloris , AJAX e navegadores que gostam de multiplexar 6 conexões TCP (com keep-alive, é claro) para o servidor, a simultaneidade é um fator importante para tornar o servidor dimensionável e bem dimensionado. A história do Apache o vinculou a esse respeito e, embora ainda não esteja ao mesmo nível de nginx ou lighttpd em termos de uso ou escala de recursos, é claro que a equipe de desenvolvimento está trabalhando na construção de um servidor da web que ainda é relevante no mundo atual de alta solicitação e simultaneidade.