Apache Prefork vs Worker MPM


113

Переглядаючи конфігураційний файл Apache, я бачу визначені Prefork та Worker MPM. У чому відмінність і яку саме використовує Apache?

Відповіді:


120

Префорк і працівник - це два типи 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


11
Див. Також "Як вибрати, який Apache MPM використовувати?" serverfault.com/a/383634
Назарій

@arvind // Кожен потік обробляє одне з'єднання одночасно // тут з'єднання означає одного користувача або один запит? pls Поясніть
користувач1844933

21

Багатопроцесорні модулі 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 beos
  • Програмне забезпечення mpm_netware
  • ОС / 2 mpmt_os2
  • Unix / Linux prefork( оновлення для версії Apache ≥ 2.4 : prefork, workerабо event, в залежності від можливостей платформи)
  • Windows 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 - Експериментальний варіант стандартного робітника MPM
  • mpm_netware Багатопроцесорний модуль, що реалізує виключно потоковий веб-сервер, оптимізований для Novell NetWare
  • mpmt_os2 Гібридний багатопроцесорний багатопотоковий MPM для OS / 2
  • prefork Реалізує веб-сервер із попередньою форкінгом без потоку
  • mpm_winnt - Цей багатопроцесорний модуль оптимізовано для Windows NT.
  • worker - Багатопроцесорний модуль, що реалізує гібридний багатопотоковий багатопроцесорний веб-сервер

Тепер, на різницю між preforkі worker.

preforkMPM

реалізує веб-сервер, що не має потоку, попередньо роздвоєний та обробляє запити аналогічно Apache 1.3. Він підходить для сайтів, яким потрібно уникати потоків для сумісності з бібліотеками, не безпечними для потоків. Це також найкращий MPM для ізоляції кожного запиту, так що проблема з одним запитом не торкнеться жодного іншого.

У workerMPM реалізує гібридну багатозадачність многопоточного сервер і дає більш високу продуктивність, тому воно повинно бути кращим , якщо один не використовують інші модулі , які містять не-поточно-бібліотеку (див також дискусію або це на Serverfault).


1
За замовчуванням встановлення ubuntu-trusty-64 apache 2.4.7 використовує подію MPM
Federico

9

Погляньте на це для більш детальної інформації. Це стосується того, як Apache обробляє декілька запитів. Оформлення, яке за замовчуванням, запускає ряд процесів Apache (2 за замовчуванням тут, хоча я вважаю, що це можна налаштувати через httpd.conf). Worker MPM запустить новий потік на запит, який, я б здогадався, є більш ефективним у пам’яті. Історично компанія Apache використовувала префорк, тому це модель, що краще перевірена. Threading було додано лише у 2.0.


3
Що з подією MPM?
Вінс Кронлейн

6

Для 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

3

Ви можете сказати, чи Apache використовує заготовку чи робітника, видавши таку команду

apache2ctl -l

У отриманому результаті шукайте згадки prefork.c або worker.c


8
Apache можна компілювати з обома модулями MPM, тому це не завжди є надійним. Якщо в ньому перелічено два модулі MPM, спробуйте apachectl -Vподивитися на висновок поруч Server MPM. Також можна перевірити ps auxі шукати httpdабо httpd.worker.
reflexiv

2
У моєму випадку apache2ctl -lне вийшло; довелося використовувати apachectl -l.
Васіландо

2
жоден з них не вказаний для мене, але apache працює чудово, Apache / 2.4.7 (Ubuntu)
karatedog

2
У centos 7.x, який працює з версією 2.4.6, httpd -Vвийде щось на зразок:Server MPM: worker
runamok

2

Легко перемикатися між 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

Чому, коли я намагався використовувати mpm_worker або mpm_event, це не працює на моїй сторінці
Лео,

0

У Apache визначено 2 типи MPM (багатообробних модулів):

1: Префорк 2: Робітник

За замовчуванням Apacke налаштований у попередньо встановленому режимі, тобто без потокового веб-сервера для попереднього розгортання. Це означає, що кожен дочірній процес Apache містить одну нитку і обробляє по одному запиту за раз. Через це вона споживає більше ресурсів.

Apache також має MPM-робочий, який перетворює Apache на багатопроцесорний багатопотоковий веб-сервер. WorkMem MPM використовує кілька дочірніх процесів з багатьма потоками кожен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.