Odpowiedzi:
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
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=NAME
w skrypcie konfiguracyjnym, gdzie NAME
jest 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_winnt
domyślnie używany jest system Windows ). Oto lista systemów operacyjnych i ich domyślnych MPM:
beos
mpm_netware
mpmt_os2
prefork
( aktualizacja do wersji Apache ≥ 2.4 : prefork
, worker
, lub event
, w zależności od możliwości platformy)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ępnempm_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 pracownikampm_netware
Moduł wieloprocesorowy implementujący wyłącznie wielowątkowy serwer sieciowy zoptymalizowany pod kątem Novell NetWarempmt_os2
Hybrydowy, wieloprocesowy, wielowątkowy MPM dla OS / 2prefork
Implementuje nietechniczny serwer sieciowy typu pre-forkingmpm_winnt
- Ten moduł wieloprocesorowy jest zoptymalizowany dla systemu Windows NT.worker
- Moduł Multi-Processing implementujący hybrydowy, wielowątkowy, wieloprocesowy serwer WWWA teraz do różnicy między prefork
a worker
.
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 worker
MPM 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).
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.
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
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
apachectl -V
spojrzeć na wyjście obok Server MPM
. Może również sprawdzić ps aux
i poszukać albo httpd
lub httpd.worker
.
apache2ctl -l
nie zadziałało; musiał użyć apachectl -l
.
httpd -V
da coś takiego:Server MPM: worker
Ł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
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.