Apache Prefork gegen Worker MPM

113

Wenn ich mir die Apache-Konfigurationsdatei ansehe, sehe ich, dass Prefork und Worker MPM definiert sind. Was ist der Unterschied und welches verwendet Apache?

Cory
quelle

Antworten:

120

Prefork und Worker sind zwei Arten von MPM-Apache. Beide haben ihre Vor- und Nachteile.

Standardmäßig ist mpm prefork, was threadsicher ist.

Prefork MPM verwendet mehrere untergeordnete Prozesse mit jeweils einem Thread, und jeder Prozess verarbeitet jeweils eine Verbindung.

Worker MPM verwendet mehrere untergeordnete Prozesse mit jeweils vielen Threads. Jeder Thread verarbeitet jeweils eine Verbindung.

Weitere Informationen finden Sie unter https://httpd.apache.org/docs/2.4/mpm.html und https://httpd.apache.org/docs/2.4/mod/prefork.html

Arvind
quelle
11
Siehe auch "Wie wähle ich das zu verwendende Apache MPM aus?" serverfault.com/a/383634
Nazariy
@arvind // Jeder Thread verarbeitet jeweils eine Verbindung // hier bedeutet Verbindung Einzelbenutzer oder Einzelanforderung? pls erklären
user1844933
21

Die Multi-Processing-Module (MPMs) von Apache sind für die Bindung an Netzwerkports auf dem Computer, das Akzeptieren von Anforderungen und das Versenden von untergeordneten Elementen zur Bearbeitung der Anforderungen verantwortlich ( http://httpd.apache.org/docs/2.2/mpm.html ).

Sie sind wie jedes andere Apache-Modul, außer dass immer nur ein MPM auf den Server geladen werden muss . MPMs werden während der Konfiguration ausgewählt und mithilfe des Arguments mit dem Konfigurationsskript, in dem der Name des gewünschten MPM angegeben ist , auf dem Server kompiliert .--with-mpm=NAMENAME

Apache verwendet für jedes Betriebssystem ein Standard-MPM, es sei denn, beim Kompilieren wird ein anderes ausgewählt (z. B. wird unter Windows mpm_winntstandardmäßig Windows verwendet). Hier ist die Liste der Betriebssysteme und ihrer Standard-MPMs:

  • BeOS beos
  • Netware mpm_netware
  • OS / 2 mpmt_os2
  • Unix / Linux prefork( Update für Apache - Version ≥ 2.4 : prefork, worker, oder event, je nach Plattform - Funktionen)
  • Windows mpm_winnt

Um zu überprüfen, welche Module auf dem Server kompiliert wurden, verwenden Sie die Befehlszeilenoption -l( hier ist die Dokumentation). Bei einer Windows-Installation erhalten Sie beispielsweise Folgendes:

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

Ab Version 2.2 ist dies die Liste der verfügbaren Kernfunktionen und MPM-Module :

  • core - Core Apache HTTP Server-Funktionen, die immer verfügbar sind
  • mpm_common - Eine Sammlung von Anweisungen, die von mehr als einem Multi-Processing-Modul (MPM) implementiert werden.
  • beos - Dieses Multi-Processing-Modul ist für BeOS optimiert.
  • event - Eine experimentelle Variante des Standard Worker MPM
  • mpm_netware Multi-Processing-Modul zur Implementierung eines exklusiven Thread-Webservers, der für Novell NetWare optimiert ist
  • mpmt_os2 Hybrides Multiprozess-MPM mit mehreren Threads für OS / 2
  • prefork Implementiert einen Webserver ohne Threading vor dem Gabeln
  • mpm_winnt - Dieses Multi-Processing-Modul ist für Windows NT optimiert.
  • worker - Multi-Processing-Modul zur Implementierung eines hybriden Multithread-Multiprozess-Webservers

Nun zum Unterschied zwischen preforkund worker.

Das preforkMPM

Implementiert einen Webserver ohne Threading und Vorgabelung, der Anforderungen ähnlich wie Apache 1.3 verarbeitet. Es ist für Websites geeignet, die Threading vermeiden müssen, um die Kompatibilität mit nicht threadsicheren Bibliotheken zu gewährleisten. Es ist auch das beste MPM zum Isolieren jeder Anforderung, sodass ein Problem mit einer einzelnen Anforderung keine Auswirkungen auf andere hat.

Das workerMPM implementiert einen hybriden Multiprozess-Multithread-Server mit mehreren Prozessen und bietet eine bessere Leistung. Daher sollte dies bevorzugt werden, es sei denn, man verwendet andere Module, die nicht threadsichere Bibliotheken enthalten (siehe auch diese Diskussion oder diese zu Serverfault).

user2314737
quelle
1
Eine Standardinstallation von Ubuntu-Trusty-64 von Apache 2.4.7 verwendet das Ereignis MPM
Federico
9

Schauen Sie sich das für weitere Details an. Es bezieht sich darauf, wie Apache mehrere Anforderungen verarbeitet. Preforking, die Standardeinstellung, startet eine Reihe von Apache-Prozessen (hier standardmäßig 2, obwohl ich glaube, dass man dies über httpd.conf konfigurieren kann). Worker MPM startet pro Anfrage einen neuen Thread, was meiner Meinung nach speichereffizienter ist. In der Vergangenheit hat Apache Prefork verwendet, daher ist es ein besser getestetes Modell. Threading wurde nur in 2.0 hinzugefügt.

hd1
quelle
3
Was ist mit Event MPM?
Vince Kronlein
6

Verwenden Sie für CentOS 6.x und 7.x (einschließlich Amazon Linux):

sudo httpd -V

Dies zeigt Ihnen, welche der MPMs konfiguriert sind. Entweder Prefork, Worker oder Event. Prefork ist das frühere, threadsichere Modell. Worker ist multithreaded und event unterstützt php-mpm, ein besseres System für die Verarbeitung von Threads und Anforderungen.

Ihre Ergebnisse können jedoch je nach Konfiguration variieren. Ich habe viel Instabilität in PHP-MPM gesehen und keine Geschwindigkeitsverbesserungen. Eine aggressive Spinne kann die maximalen untergeordneten Prozesse in PHP-MPM ziemlich leicht erschöpfen.

Die Einstellung für Prefork, Worker oder Event wird in sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (für CentOS 6.x / 7.x / Apache 2.4) festgelegt.

# 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
jeffmcneill
quelle
3

Sie können feststellen, ob Apache Preform oder Worker verwendet, indem Sie den folgenden Befehl eingeben

apache2ctl -l

Suchen Sie in der resultierenden Ausgabe nach Erwähnungen von prefork.c oder worker.c

Rimu Atkinson
quelle
8
Apache kann mit beiden MPM-Modulen kompiliert werden, daher ist dies nicht immer zuverlässig. Wenn zwei MPM-Module aufgelistet sind, apachectl -Vschauen Sie sich die Ausgabe neben an Server MPM. Kann auch ps auxnach httpdoder suchen httpd.worker.
Reflexiv
2
In meinem Fall apache2ctl -lhat nicht funktioniert; musste verwenden apachectl -l.
Vacilando
2
Keiner von ihnen ist für mich aufgelistet, aber Apache funktioniert gut, Apache / 2.4.7 (Ubuntu)
Karatedog
2
In Centos 7.x, auf dem Apache 2.4.6 ausgeführt wird, httpd -Vwird Server MPM: worker
Folgendes angezeigt
2

In Apache 2.4 auf RHEL7 ist es einfach, zwischen Prefork- und Worker-MPM zu wechseln

Überprüfen Sie den MPM-Typ durch Ausführen

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"

Um nun das MPM zu ändern, bearbeiten Sie die folgende Datei und kommentieren Sie das erforderliche MPM aus

 /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
Harsimranjit Singh Kler
quelle
Warum, wenn ich versucht habe, mpm_worker oder mpm_event zu verwenden, funktioniert es nicht auf meiner Seite
Leoh
0

In Apache sind zwei Arten von MPM (Multi-Processing Modules) definiert:

1: Prefork 2: Arbeiter

Standardmäßig ist Apacke im Prefork-Modus konfiguriert, dh im Pre-Forking-Webserver ohne Thread. Das bedeutet, dass jeder untergeordnete Apache-Prozess einen einzelnen Thread enthält und jeweils eine Anforderung verarbeitet. Aus diesem Grund verbraucht es mehr Ressourcen.

Apache verfügt auch über das Worker-MPM, das Apache in einen Webserver mit mehreren Prozessen und mehreren Threads verwandelt. Worker MPM verwendet mehrere untergeordnete Prozesse mit jeweils vielen Threads.

Rahul Chaubey
quelle