Apache Prefork contro Worker MPM


113

Guardando il file di configurazione di Apache, vedo che Prefork e Worker MPM sono definiti. Qual è la differenza e quale utilizza Apache?

Risposte:


120

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


11
Vedi anche "Come seleziono quale Apache MPM usare?" serverfault.com/a/383634
Nazariy

@arvind // Ogni thread gestisce una connessione alla volta // qui connessione significa singolo utente o singola richiesta? per favore spiega
user1844933

21

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=NAMEcon 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_winntviene utilizzato per impostazione predefinita). Ecco l'elenco dei sistemi operativi e dei loro MPM predefiniti:

  • BeOS beos
  • Netware mpm_netware
  • OS / 2 mpmt_os2
  • Unix / Linux prefork( update per la versione di Apache ≥ 2.4 : prefork, worker, o event, a seconda delle funzionalità della piattaforma)
  • finestre 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 disponibili
  • mpm_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 MPM
  • mpm_netware Modulo multi-elaborazione che implementa un server Web esclusivamente threaded ottimizzato per Novell NetWare
  • mpmt_os2 MPM ibrido multi-processo e multi-thread per OS / 2
  • prefork Implementa un server Web senza thread e pre-fork
  • mpm_winnt - Questo modulo multi-elaborazione è ottimizzato per Windows NT.
  • worker - Modulo multi-elaborazione che implementa un server web multi-processo multi-threaded ibrido

Ora, per la differenza tra preforke worker.

Il preforkMPM

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' workerMPM 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).


1
Un'installazione predefinita di ubuntu-trusty-64 di apache 2.4.7 utilizza l'evento MPM
Federico

9

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.


3
Che mi dici di Event MPM?
Vince Kronlein

6

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

3

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


8
Apache può essere compilato con entrambi i moduli MPM, quindi non è sempre affidabile. Se elenca due moduli MPM, prova a apachectl -Vguardare l'output accanto a Server MPM. Inoltre può controllare ps auxe cercare httpdo httpd.worker.
reflexiv

2
Nel mio caso apache2ctl -lnon ha funzionato; doveva usare apachectl -l.
Vacilando

2
nessuno di loro è elencato per me, ma apache funziona bene, Apache / 2.4.7 (Ubuntu)
karatedog

2
In centos 7.x che esegue apache 2.4.6, httpd -Vdarà qualcosa come:Server MPM: worker
runamok

2

È 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

Perché quando ho provato a utilizzare mpm_worker o mpm_event, non funziona la mia pagina
Leoh

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.