Apache é um servidor WEB (HTTPD) portado para várias plataformas e ambientes. O servidor WEB Apache pode ser executado em
GNU/Linux, Windows, Netware ou OS/2. Para comportar essa flexibilidade de ambientes, Apache adota um projeto modular que permite ao webmaster escolher, entre um conjunto de funcionalidades, quais serão ativadas ou desativadas.
Os módulos são implementados de duas maneiras: estáticos ou dinâmicos:
- Os módulos estáticos são inseridos em "tempo de compilação" e são incorporados ao código binário do servidor.
- Os módulos dinâmicos são ligados (link) ao código binário do servidor em "tempo de execução".
Os módulos do tipo MPM, são responsáveis pela definição de como o servidor atende pelas requisições HTTP dos clientes. As requisições chegam pela rede como pacotes TCP, por padrão na porta TCP/80. Para atender uma requisição HTTP, o servidor deve fazer um fork ou lançar um thread.
Esses métodos causam diferentes impactos no modo de trabalho do servidor e, principalmente, nos recursos de hardware (memória RAM e processador) necessários para atender todas as solicitações.
Originalmente, Apache utilizava o método prefork e lançava uma cópia da aplicação servidora (fork) para atender cada solicitação. Com o tempo, esse método se tornou ineficiente, pois os servidores passaram a atender milhares de requisições simultaneamente.
A quantidade de recursos de memória e de processamento para manter esse método, é enorme. O método prefork é mantido para fins de compatibilidade com antigos sistemas que não podem suportar o uso de threads, para servidores que atendem poucas requisições ou possuem um processador legado de núcleo único.
Entretanto, mesmo hoje prefork é conhecido pela estabilidade de seu código, desenvolvido ao longo de anos, e ainda é o modo preferido por muitos administradores.
Servidores GNU/Linux que demandam escalabilidade, podem escolher entre os módulos
worker ou
event. Esses métodos dão suporte nativo para o uso de threads e implementam escalabilidade através do compartilhamento de recursos de hardware (principalmente memória RAM) entre os diversos threads (tarefas).
Os threads são linhas de execução de um programa que se dividem como tarefas distintas e que podem compartilhar recursos comuns no contexto de software (memória). Isso provê um melhor aproveitamento da memória RAM e reduz a sobrecarga gerada pelo processo de lançar processos através de fork.
Com o advento dos processadores de múltiplos núcleos, o uso de threads atingiu o patamar mais alto; as diferentes tarefas são realmente processadas simultaneamente por diferentes núcleos de processadores. Observe que os threads compartilham o mesmo contexto de software para diferentes contextos de hardware, pois são ligados ao mesmo processo pai.
O suporte e os métodos para o funcionamento de threads são totalmente fornecidos pelo sistema operacional, que podem ser distintos entre si, apresentando diferentes níveis de maturidade da implementação das funções de thread.
Os
MPM prefork,
worker e
event são exclusivos de sistemas do tipo UNIX. Para os demais sistemas, temos: mpm_netware, mpm_os2 e mpm_winnt. Cada um aproveitando as melhores características desses sistemas operacionais.
Atualmente, (2014) o MPM padrão para modernos sistemas do tipo UNIX é
event.
Para ajudar na escolha do MPM, duas perguntas são feitas.
1. O núcleo do sistema operacional suporta threads?
2. O núcleo do sistema operacional suporta threads seguros (thread-safe polling)?
- Se a resposta é sim para ambas perguntas, seu MPM deve ser event.
- Se a resposta é sim para a primeira pergunta, seu MPM deve ser worker.
- Se a resposta é não para ambas perguntas, seu MPM deve ser prefork.