Apache Prefork vs Worker MPM

113

Patrząc na plik konfiguracyjny Apache, widzę zdefiniowane Prefork i Worker MPM. Jaka jest różnica i który z nich jest używany przez Apache?

Cory
źródło

Odpowiedzi:

120

Prefork i pracownik to dwa rodzaje MPM, które zapewnia apache. Obie mają swoje zalety i wady.

Domyślnie mpm to prefork, który jest bezpieczny dla wątków.

Prefork MPM używa wielu procesów potomnych, z których każdy ma jeden wątek, a każdy proces obsługuje jedno połączenie na raz.

Worker MPM używa wielu procesów potomnych, z których każdy ma wiele wątków. Każdy wątek obsługuje jedno połączenie naraz.

Więcej informacji można znaleźć na stronach https://httpd.apache.org/docs/2.4/mpm.html i https://httpd.apache.org/docs/2.4/mod/prefork.html

Arvind
źródło
11
Zobacz także „Jak wybrać serwer Apache MPM do użycia?” serverfault.com/a/383634
Nazariy
@arvind // Każdy wątek obsługuje jedno połączenie naraz // tutaj połączenie oznacza pojedynczego użytkownika czy pojedyncze żądanie? pls wyjaśnij
user1844933
21

Moduły wieloprocesorowe Apache (MPM) są odpowiedzialne za wiązanie z portami sieciowymi na komputerze, przyjmowanie żądań i wysyłanie dzieci do obsługi żądań ( http://httpd.apache.org/docs/2.2/mpm.html ).

Są jak każdy inny moduł Apache, z wyjątkiem tego, że tylko jeden MPM musi być załadowany na serwer w dowolnym momencie . MPM są wybierane podczas konfiguracji i kompilowane na serwerze przy użyciu argumentu --with-mpm=NAMEw skrypcie konfiguracyjnym, gdzie NAMEjest nazwą żądanego MPM.

Apache użyje domyślnego MPM dla każdego systemu operacyjnego, chyba że w czasie kompilacji zostanie wybrany inny (na przykład mpm_winntdomyślnie używany jest system Windows ). Oto lista systemów operacyjnych i ich domyślnych MPM:

  • BeOS beos
  • Netware mpm_netware
  • OS / 2 mpmt_os2
  • Unix / Linux prefork( aktualizacja do wersji Apache ≥ 2.4 : prefork, worker, lub event, w zależności od możliwości platformy)
  • Windows mpm_winnt

Aby sprawdzić, jakie moduły są wkompilowane na serwer, użyj opcji wiersza poleceń -l( tutaj jest dokumentacja). Na przykład w instalacji systemu Windows możesz otrzymać coś takiego:

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

Od wersji 2.2 jest to lista dostępnych podstawowych funkcji i modułów MPM :

  • core - Podstawowe funkcje serwera Apache HTTP, które są zawsze dostępne
  • mpm_common - Zbiór dyrektyw, które są implementowane przez więcej niż jeden moduł wieloprocesorowy (MPM)
  • beos - Ten moduł wieloprocesorowy jest zoptymalizowany pod kątem systemu BeOS.
  • event - Eksperymentalny wariant standardowego MPM pracownika
  • mpm_netware Moduł wieloprocesorowy implementujący wyłącznie wielowątkowy serwer sieciowy zoptymalizowany pod kątem Novell NetWare
  • mpmt_os2 Hybrydowy, wieloprocesowy, wielowątkowy MPM dla OS / 2
  • prefork Implementuje nietechniczny serwer sieciowy typu pre-forking
  • mpm_winnt - Ten moduł wieloprocesorowy jest zoptymalizowany dla systemu Windows NT.
  • worker - Moduł Multi-Processing implementujący hybrydowy, wielowątkowy, wieloprocesowy serwer WWW

A teraz do różnicy między preforka worker.

preforkMPM

implementuje nietechniczny serwer sieciowy typu pre-forking, który obsługuje żądania w sposób podobny do Apache 1.3. Jest odpowiedni dla witryn, które muszą unikać tworzenia wątków w celu zapewnienia zgodności z bibliotekami, które nie są bezpieczne dla wątków. Jest to również najlepszy MPM do izolowania każdego żądania, dzięki czemu problem z jednym żądaniem nie wpływa na żadne inne.

W workerMPM narzędzia hybrydowy wieloprocesowa wielowątkowy serwer i daje lepsze wyniki, a więc powinny być korzystne, jeżeli nie stosuje się innych modułów, które zawierają biblioteki nie bezpieczny wątku (patrz również dyskusję czy to na ServerFault).

user2314737
źródło
1
Domyślna instalacja Ubuntu-Trusty-64 Apache 2.4.7 używa zdarzenia MPM
Federico
9

Spójrz na to, aby uzyskać więcej szczegółów. Odnosi się do tego, jak Apache obsługuje wiele żądań. Preforking, który jest domyślny, uruchamia pewną liczbę procesów Apache (domyślnie 2 tutaj, chociaż uważam, że można to skonfigurować przez httpd.conf). Worker MPM uruchomi nowy wątek na żądanie, co, jak sądzę, jest bardziej wydajne pod względem pamięci. Historycznie Apache używał preforków, więc jest to lepiej przetestowany model. Wątkowanie zostało dodane tylko w 2.0.

hd1
źródło
3
A co z Event MPM?
Vince Kronlein
6

W przypadku CentOS 6.x i 7.x (w tym Amazon Linux) użyj:

sudo httpd -V

To pokaże, które z MPM są skonfigurowane. Albo prefork, pracownik lub wydarzenie. Prefork jest wcześniejszym, bezpiecznym wątkowo modelem. Worker jest wielowątkowy, a zdarzenie obsługuje php-mpm, co ma być lepszym systemem do obsługi wątków i żądań.

Jednak wyniki mogą się różnić w zależności od konfiguracji. Widziałem wiele niestabilności w php-mpm i żadnych ulepszeń szybkości. Agresywny pająk może dość łatwo wyczerpać maksymalne procesy potomne w php-mpm.

Ustawienie prefork, worker lub event jest ustawiane w sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (dla 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
jeffmcneill
źródło
3

Możesz sprawdzić, czy Apache używa preform, czy pracownika, wydając następujące polecenie

apache2ctl -l

W wynikowym wyniku poszukaj wzmianek o prefork.c lub worker.c

Rimu Atkinson
źródło
8
Apache można skompilować z obydwoma modułami MPM, więc nie zawsze jest to niezawodne. Jeśli wyświetla dwa moduły MPM, spróbuj apachectl -Vspojrzeć na wyjście obok Server MPM. Może również sprawdzić ps auxi poszukać albo httpdlub httpd.worker.
reflexiv
2
W moim przypadku apache2ctl -lnie zadziałało; musiał użyć apachectl -l.
Vacilando
2
żaden z nich nie jest wymieniony dla mnie, ale apache działa dobrze, Apache / 2.4.7 (Ubuntu)
karatedog
2
W centos 7.x, na którym działa Apache 2.4.6, httpd -Vda coś takiego:Server MPM: worker
runamok
2

Łatwo jest przełączać się między mpm prefork lub roboczym w Apache 2.4 na RHEL7

Sprawdź typ MPM, wykonując

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"

Teraz, aby zmienić MPM, edytuj następujący plik i odkomentuj wymagany MPM

 /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
źródło
Dlaczego, kiedy próbowałem użyć mpm_worker lub mpm_event, moja strona nie działa
Leoh
0

Apache ma zdefiniowane 2 typy MPM (Multi-Processing Modules):

1: Prefork 2: Pracownik

Domyślnie Apacke jest skonfigurowany w trybie preforked, tj. Bez wątku pre-forking web server. Oznacza to, że każdy proces potomny Apache zawiera pojedynczy wątek i jednocześnie obsługuje jedno żądanie. Z tego powodu zużywa więcej zasobów.

Apache posiada również Worker MPM, który zamienia Apache w wieloprocesowy, wielowątkowy serwer WWW. Worker MPM używa wielu procesów potomnych, z których każdy ma wiele wątków.

Rahul Chaubey
źródło