Відповіді:
Префорк і працівник - це два типи MPM-апашей. Обоє мають свої достоїнства та недоліки.
За замовчуванням mpm є префорком, який захищений потоком.
Prefork MPM використовує кілька дочірніх процесів з одним потоком кожен, і кожен процес обробляє по одному з'єднанню одночасно.
WorkMem MPM використовує кілька дочірніх процесів з багатьма потоками кожен. Кожна нитка обробляє по одному з'єднанню.
Для отримання більш детальної інформації ви можете відвідати https://httpd.apache.org/docs/2.4/mpm.html та https://httpd.apache.org/docs/2.4/mod/prefork.html
Багатопроцесорні модулі Apache (MPM) відповідають за прив'язку до мережевих портів на пристрої, прийняття запитів та відправлення дітей для обробки запитів ( http://httpd.apache.org/docs/2.2/mpm.html ).
Вони, як і будь-який інший модуль Apache, за винятком того, що на сервер потрібно будь-коли завантажувати лише один і лише один MPM . MPM вибираються під час конфігурації та компілюються на сервер , використовуючи аргумент --with-mpm=NAME
із сценарієм configure, де NAME
є ім'я потрібного MPM.
Apache використовуватиме MPM за замовчуванням для кожної операційної системи, якщо інший не буде обраний під час компіляції (наприклад, для Windows mpm_winnt
використовується за замовчуванням). Ось перелік операційних систем та їх MPM за замовчуванням:
beos
mpm_netware
mpmt_os2
prefork
( оновлення для версії Apache ≥ 2.4 : prefork
, worker
або event
, в залежності від можливостей платформи)mpm_winnt
Щоб перевірити, які модулі збираються на сервері, використовуйте параметр командного рядка -l
( ось документація). Наприклад, при установці Windows ви можете отримати щось на кшталт:
> httpd -l
Compiled in modules:
core.c
mod_win32.c
mpm_winnt.c
http_core.c
mod_so.c
Станом на версію 2.2 це список доступних основних функцій та модулів MPM :
core
- Основні функції HTTP-сервера Core Apache, які завжди доступніmpm_common
- Колекція директив, що реалізуються більш ніж одним модулем багатопроцесорної обробки (MPM)beos
- Цей багатопроцесорний модуль оптимізований для BeOS.event
- Експериментальний варіант стандартного робітника MPMmpm_netware
Багатопроцесорний модуль, що реалізує виключно потоковий веб-сервер, оптимізований для Novell NetWarempmt_os2
Гібридний багатопроцесорний багатопотоковий MPM для OS / 2prefork
Реалізує веб-сервер із попередньою форкінгом без потокуmpm_winnt
- Цей багатопроцесорний модуль оптимізовано для Windows NT.worker
- Багатопроцесорний модуль, що реалізує гібридний багатопотоковий багатопроцесорний веб-серверТепер, на різницю між prefork
і worker
.
реалізує веб-сервер, що не має потоку, попередньо роздвоєний та обробляє запити аналогічно Apache 1.3. Він підходить для сайтів, яким потрібно уникати потоків для сумісності з бібліотеками, не безпечними для потоків. Це також найкращий MPM для ізоляції кожного запиту, так що проблема з одним запитом не торкнеться жодного іншого.
У worker
MPM реалізує гібридну багатозадачність многопоточного сервер і дає більш високу продуктивність, тому воно повинно бути кращим , якщо один не використовують інші модулі , які містять не-поточно-бібліотеку (див також дискусію або це на Serverfault).
Погляньте на це для більш детальної інформації. Це стосується того, як Apache обробляє декілька запитів. Оформлення, яке за замовчуванням, запускає ряд процесів Apache (2 за замовчуванням тут, хоча я вважаю, що це можна налаштувати через httpd.conf). Worker MPM запустить новий потік на запит, який, я б здогадався, є більш ефективним у пам’яті. Історично компанія Apache використовувала префорк, тому це модель, що краще перевірена. Threading було додано лише у 2.0.
Для CentOS 6.x та 7.x (включаючи Amazon Linux) використовуйте:
sudo httpd -V
Це покаже вам, які з MPM налаштовані. Або префорк, працівник, або подія. Prefork - це більш рання, безпечна модель. Worker є багатопотоковою, а подія підтримує php-mpm, який повинен бути кращою системою для обробки потоків та запитів.
Однак ваші результати можуть відрізнятися залежно від конфігурації. Я бачив багато нестабільності в php-mpm, а не будь-які покращення швидкості. Агресивний павук може досить легко вичерпати максимальні дочірні процеси в php-mpm.
Установка для prefork, робочого або події встановлюється в sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (для 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
Ви можете сказати, чи Apache використовує заготовку чи робітника, видавши таку команду
apache2ctl -l
У отриманому результаті шукайте згадки prefork.c або worker.c
apachectl -V
подивитися на висновок поруч Server MPM
. Також можна перевірити ps aux
і шукати httpd
або httpd.worker
.
apache2ctl -l
не вийшло; довелося використовувати apachectl -l
.
httpd -V
вийде щось на зразок:Server MPM: worker
Легко перемикатися між prefork або mpm в Apache 2.4 на RHEL7
Перевірте тип MPM, виконавши
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"
Тепер для зміни редагування MPM наступний файл та відмітка потрібен 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 визначено 2 типи MPM (багатообробних модулів):
1: Префорк 2: Робітник
За замовчуванням Apacke налаштований у попередньо встановленому режимі, тобто без потокового веб-сервера для попереднього розгортання. Це означає, що кожен дочірній процес Apache містить одну нитку і обробляє по одному запиту за раз. Через це вона споживає більше ресурсів.
Apache також має MPM-робочий, який перетворює Apache на багатопроцесорний багатопотоковий веб-сервер. WorkMem MPM використовує кілька дочірніх процесів з багатьма потоками кожен.