Il y a deux tribus, modes pour apache 2 : prefork et worker, affectés au moment de la compilation.

Quelles différences ?

En mode prefork, les requêtes sont traitées par des processus lourds. Le premier processus lancé écoute sur le port 80 (et/ou 443, ou autre), puis dispatche les requêtes sur des processus fils (le nom prefork venant de la méthode C fork qui permet de créer de nouveaux processus sous unix).

Pour traiter 250 connexions simultanées, il faudra donc 251 processus : le processus parent qui écoute et les 250 fils qui traitent.

Dans la configuration, le paramètre ServerLimit limite le nombre de processus pouvant être lancés au maximum. Le paramètre MaxClients limite le nombre de clients pouvant se connecter. Il doit être inférieur ou égal à ServerLimit, l’égalité étant plus logique.

Exemple de configuration :

<IfModule mpm_prefork_module>
    ServerLimit         500
    MaxClients          500
    MaxRequestsPerChild   0
</IfModule>

En mode worker, les requêtes sont traitées par des threads, eux même regroupés dans des processus. On a par exemple 25 thread par processus, et 10 processus. Pour traiter 250 requêtes il faudra 11 processus, et 250 threads. Le MaxClients correspond au nombre de threads total. Il faudra aussi configurer le nombre de processus et le nombre de thread par processus. Le MaxClients peut inférieur au nombre de processus (ServerLimit) multiplié par le nombre de thread (ThreadsPerChild), mais pas supérieur.

Exemple de configuration :

<IfModule mpm_worker_module>
    [...]
    ServerLimit         20
    MaxClients          500
    [...]
    ThreadsPerChild      25
</IfModule>

Lequel utiliser ?

Le mode worker utilisant des processus léger, il est plus performant pour traiter un grand nombre d’utilisateurs : moins de mémoire occupée, context switching plus léger… Or par défaut, apache est installé en mode prefork. Pourquoi ? Pour éviter les problèmes avec certaines librairies PHP qui ne sont pas thread safe.