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.