Réponses:
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
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=NAME
avec le script configure où NAME
est 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_winnt
est utilisé par défaut). Voici la liste des systèmes d'exploitation et de leurs MPM par défaut:
beos
mpm_netware
mpmt_os2
prefork
( mise à jour pour la version Apache ≥ 2.4 : prefork
, worker
ou event
, selon les capacités de la plate - forme)mpm_winnt
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 disponiblesmpm_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 workermpm_netware
Module multi-traitement implémentant un serveur Web exclusivement threadé optimisé pour Novell NetWarempmt_os2
MPM hybride multi-processus et multi-thread pour OS / 2prefork
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-threadMaintenant, à la différence entre prefork
et worker
.
Le prefork
MPM
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 worker
MPM 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).
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.
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
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
apachectl -V
regarder la sortie à côté de Server MPM
. Peut également vérifier ps aux
et rechercher soit httpd
ou httpd.worker
.
apache2ctl -l
n'a pas fonctionné; dû utiliser apachectl -l
.
httpd -V
donnera quelque chose comme:Server MPM: worker
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
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.