Apache Prefork vs Worker MPM


113

En regardant le fichier de configuration Apache, je vois Prefork et Worker MPM définis. Quelle est la différence et laquelle utilise Apache?

Réponses:


120

Prefork et worker sont deux types de MPM fournis par Apache. Les deux ont leurs mérites et leurs inconvénients.

Par défaut, mpm est prefork qui est thread-safe.

Prefork MPM utilise plusieurs processus enfants avec un thread chacun et chaque processus gère une connexion à la fois.

Worker MPM utilise plusieurs processus enfants avec chacun de nombreux threads. Chaque thread gère une connexion à la fois.

Pour plus de détails, vous pouvez visiter https://httpd.apache.org/docs/2.4/mpm.html et https://httpd.apache.org/docs/2.4/mod/prefork.html


11
Voir aussi "Comment sélectionner le MPM Apache à utiliser?" serverfault.com/a/383634
Nazariy

@arvind // Chaque thread gère une connexion à la fois // ici la connexion signifie un seul utilisateur ou une seule demande? pls expliquer
user1844933

21

Les modules multi-traitements (MPM) d'Apache sont responsables de la liaison aux ports réseau de la machine, de l'acceptation des requêtes et de l'envoi des enfants pour gérer les requêtes ( http://httpd.apache.org/docs/2.2/mpm.html ).

Ils sont comme n'importe quel autre module Apache, sauf qu'un seul et un seul MPM doit être chargé sur le serveur à tout moment . Les MPM sont choisis lors de la configuration et compilés dans le serveur en utilisant l'argument --with-mpm=NAMEavec le script configure où NAMEest le nom du MPM souhaité.

Apache utilisera un MPM par défaut pour chaque système d'exploitation à moins qu'un autre ne soit choisi au moment de la compilation (par exemple sous Windows mpm_winntest utilisé par défaut). Voici la liste des systèmes d'exploitation et de leurs MPM par défaut:

Pour vérifier quels modules sont compilés dans le serveur, utilisez l'option de ligne de commande -l( voici la documentation). Par exemple, sur une installation Windows, vous pourriez obtenir quelque chose comme:

> httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c

À partir de la version 2.2, voici la liste des fonctionnalités principales et des modules MPM disponibles :

  • core - Fonctionnalités principales du serveur HTTP Apache toujours disponibles
  • mpm_common - Un ensemble de directives implémentées par plus d'un module multi-traitement (MPM)
  • beos - Ce module multi-traitement est optimisé pour BeOS.
  • event - Une variante expérimentale du MPM standard worker
  • mpm_netware Module multi-traitement implémentant un serveur Web exclusivement threadé optimisé pour Novell NetWare
  • mpmt_os2 MPM hybride multi-processus et multi-thread pour OS / 2
  • prefork Implémente un serveur Web pré-forking non threadé
  • mpm_winnt - Ce module multi-traitement est optimisé pour Windows NT.
  • worker - Module multi-traitement implémentant un serveur web multi-processus hybride multi-thread

Maintenant, à la différence entre preforket worker.

Le preforkMPM

implémente un serveur Web de pré-forking non threadé qui gère les requêtes d'une manière similaire à Apache 1.3. Il convient aux sites qui doivent éviter les threads pour assurer la compatibilité avec les bibliothèques non thread-safe. C'est également le meilleur MPM pour isoler chaque requête, de sorte qu'un problème avec une seule requête n'affectera aucune autre.

Le workerMPM implémente un serveur multi-thread multi-thread hybride et donne de meilleures performances, il devrait donc être préférable à moins que l'on utilise d'autres modules qui contiennent des bibliothèques non thread-safe (voir aussi cette discussion ou ceci sur Serverfault).


1
Une installation par défaut d'ubuntu-trusty-64 d'apache 2.4.7 utilise l'événement MPM
Federico

9

Jetez un œil à ceci pour plus de détails. Il fait référence à la manière dont Apache gère plusieurs requêtes. Preforking, qui est la valeur par défaut, démarre un certain nombre de processus Apache (2 par défaut ici, bien que je pense que l'on puisse configurer cela via httpd.conf). Worker MPM lancera un nouveau thread par requête, ce qui, je suppose, est plus efficace en mémoire. Historiquement, Apache a utilisé prefork, c'est donc un modèle mieux testé. Le filetage n'a été ajouté que dans la version 2.0.


3
Qu'en est-il de Event MPM?
Vince Kronlein

6

Pour CentOS 6.x et 7.x (y compris Amazon Linux), utilisez:

sudo httpd -V

Cela vous montrera lesquels des MPM sont configurés. Soit prefork, worker ou event. Prefork est le premier modèle threadsafe. Worker est multi-thread, et l'événement prend en charge php-mpm qui est censé être un meilleur système pour gérer les threads et les requêtes.

Cependant, vos résultats peuvent varier en fonction de la configuration. J'ai vu beaucoup d'instabilité dans php-mpm et aucune amélioration de la vitesse. Une araignée agressive peut épuiser assez facilement le maximum de processus enfants dans php-mpm.

Le paramètre pour prefork, worker ou event est défini dans sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (pour CentOS 6.x / 7.x / Apache 2.4).

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#LoadModule mpm_event_module modules/mod_mpm_event.so

3

Vous pouvez savoir si Apache utilise préforme ou worker en exécutant la commande suivante

apache2ctl -l

Dans la sortie résultante, recherchez les mentions de prefork.c ou worker.c


8
Apache peut être compilé avec les deux modules MPM, donc ce n'est pas toujours fiable. S'il répertorie deux modules MPM, essayez de apachectl -Vregarder la sortie à côté de Server MPM. Peut également vérifier ps auxet rechercher soit httpdou httpd.worker.
reflexiv

2
Dans mon cas, cela apache2ctl -ln'a pas fonctionné; dû utiliser apachectl -l.
Vacilando

2
aucun d'entre eux n'est répertorié pour moi, mais apache fonctionne bien, Apache / 2.4.7 (Ubuntu)
karatedog

2
Dans centos 7.x qui exécute apache 2.4.6, httpd -Vdonnera quelque chose comme:Server MPM: worker
runamok

2

Il est facile de basculer entre Prefork ou Worker mpm dans Apache 2.4 sur RHEL7

Vérifiez le type MPM en exécutant

sudo httpd -V

Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built:   Jul 26 2017 04:45:44
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Maintenant, pour changer MPM, éditez le fichier suivant et décommentez MPM requis

 /etc/httpd/conf.modules.d/00-mpm.conf 

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

Pourquoi quand j'ai essayé d'utiliser mpm_worker ou mpm_event, cela ne fonctionne pas ma page
Leoh

0

Apache a 2 types de MPM (Multi-Processing Modules) définis:

1: Prefork 2: Travailleur

Par défaut, Apacke est configuré en mode préforké, c'est-à-dire un serveur Web pré-forking non threadé. Cela signifie que chaque processus enfant Apache contient un seul thread et gère une requête à la fois. À cause de cela, il consomme plus de ressources.

Apache possède également le MPM de travail qui transforme Apache en un serveur Web multi-processus et multi-thread. Worker MPM utilise plusieurs processus enfants avec chacun de nombreux threads.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.