Risposte:
Prefork e worker sono due tipi di MPM forniti da apache. Entrambi hanno i loro meriti e demeriti.
Per impostazione predefinita, mpm è prefork che è thread-safe.
Prefork MPM utilizza più processi figlio con un thread ciascuno e ogni processo gestisce una connessione alla volta.
Worker MPM utilizza più processi figlio con molti thread ciascuno. Ogni thread gestisce una connessione alla volta.
Per maggiori dettagli puoi visitare https://httpd.apache.org/docs/2.4/mpm.html e https://httpd.apache.org/docs/2.4/mod/prefork.html
I Multi-Processing Modules (MPM) di Apache sono responsabili dell'associazione alle porte di rete sulla macchina, dell'accettazione delle richieste e dell'invio di bambini per gestire le richieste ( http://httpd.apache.org/docs/2.2/mpm.html ).
Sono come qualsiasi altro modulo Apache, tranne per il fatto che solo uno e solo un MPM deve essere caricato nel server in qualsiasi momento . Gli MPM vengono scelti durante la configurazione e compilati nel server utilizzando l'argomento --with-mpm=NAME
con lo script di configurazione dove NAME
è il nome dell'MPM desiderato.
Apache utilizzerà un MPM predefinito per ogni sistema operativo a meno che non ne venga scelto uno diverso in fase di compilazione (ad esempio su Windows mpm_winnt
viene utilizzato per impostazione predefinita). Ecco l'elenco dei sistemi operativi e dei loro MPM predefiniti:
beos
mpm_netware
mpmt_os2
prefork
( update per la versione di Apache ≥ 2.4 : prefork
, worker
, o event
, a seconda delle funzionalità della piattaforma)mpm_winnt
Per verificare quali moduli sono compilati nel server, utilizzare l'opzione della riga di comando -l
( qui è la documentazione). Ad esempio su un'installazione di Windows potresti ottenere qualcosa come:
> httpd -l
Compiled in modules:
core.c
mod_win32.c
mpm_winnt.c
http_core.c
mod_so.c
A partire dalla versione 2.2, questo è l' elenco delle funzionalità principali e dei moduli MPM disponibili :
core
- Funzionalità principali di Apache HTTP Server sempre disponibilimpm_common
- Una raccolta di direttive implementate da più di un modulo multi-elaborazione (MPM)beos
- Questo modulo multi-elaborazione è ottimizzato per BeOS.event
- Una variante sperimentale del lavoratore standard MPMmpm_netware
Modulo multi-elaborazione che implementa un server Web esclusivamente threaded ottimizzato per Novell NetWarempmt_os2
MPM ibrido multi-processo e multi-thread per OS / 2prefork
Implementa un server Web senza thread e pre-forkmpm_winnt
- Questo modulo multi-elaborazione è ottimizzato per Windows NT.worker
- Modulo multi-elaborazione che implementa un server web multi-processo multi-threaded ibridoOra, per la differenza tra prefork
e worker
.
Il prefork
MPM
implementa un server Web senza thread e pre-fork che gestisce le richieste in modo simile ad Apache 1.3. È appropriato per i siti che devono evitare il threading per la compatibilità con le librerie non thread-safe. È anche il miglior MPM per isolare ogni richiesta, in modo che un problema con una singola richiesta non influenzi le altre.
L' worker
MPM implementa un server multi-thread multi-processo ibrido e offre prestazioni migliori, quindi dovrebbe essere preferito a meno che non si stiano utilizzando altri moduli che contengono librerie non thread-safe (vedere anche questa discussione o questa su Serverfault).
Dai un'occhiata a questo per maggiori dettagli. Si riferisce al modo in cui Apache gestisce più richieste. Il preforking, che è l'impostazione predefinita, avvia una serie di processi Apache (2 di default qui, anche se credo che sia possibile configurarlo tramite httpd.conf). Worker MPM avvierà un nuovo thread per richiesta, che immagino sia più efficiente in termini di memoria. Storicamente, Apache ha utilizzato prefork, quindi è un modello testato meglio. Il threading è stato aggiunto solo nella 2.0.
Per CentOS 6.x e 7.x (incluso Amazon Linux) utilizzare:
sudo httpd -V
Questo ti mostrerà quali degli MPM sono configurati. O prefork, worker o event. Prefork è il modello precedente, thread-safe. Worker è multi-thread e l'evento supporta php-mpm che dovrebbe essere un sistema migliore per la gestione di thread e richieste.
Tuttavia, i risultati possono variare in base alla configurazione. Ho visto molta instabilità in php-mpm e nessun miglioramento della velocità. Un ragno aggressivo può esaurire abbastanza facilmente i processi figlio massimi in php-mpm.
L'impostazione per prefork, worker o event è impostata in sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (per 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
Puoi sapere se Apache sta usando preform o worker emettendo il seguente comando
apache2ctl -l
Nell'output risultante, cerca le menzioni di prefork.c o worker.c
apachectl -V
guardare l'output accanto a Server MPM
. Inoltre può controllare ps aux
e cercare httpd
o httpd.worker
.
apache2ctl -l
non ha funzionato; doveva usare apachectl -l
.
httpd -V
darà qualcosa come:Server MPM: worker
È facile passare da prefork a worker mpm in Apache 2.4 su RHEL7
Controlla il tipo di MPM eseguendo
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"
Ora per cambiare MPM, modifica il seguente file e decommenta MPM richiesto
/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 ha 2 tipi di MPM (Multi-Processing Modules) definiti:
1: Prefork 2: Worker
Per impostazione predefinita, Apacke è configurato in modalità preforked cioè server web pre-fork non threaded. Ciò significa che ogni processo figlio di Apache contiene un singolo thread e gestisce una richiesta alla volta. Per questo motivo, consuma più risorse.
Apache ha anche l'MPM worker che trasforma Apache in un server web multi-processo e multi-thread. Worker MPM utilizza più processi figlio con molti thread ciascuno.