Глядя на конфигурационный файл Apache, я вижу Prefork и WorkM MPM. В чем разница и какой из них использует Apache?
Предпрограмма и работник - это два типа MPM apache. Оба имеют свои достоинства и недостатки.
По умолчанию mpm - это предпрок, который является потокобезопасным.
Prefork MPM использует несколько дочерних процессов с одним потоком каждый, и каждый процесс обрабатывает одно соединение за раз.
Рабочий 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
с конфигурацией script, где 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 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 реализует гибридный многопроцессорный многопроцессорный сервер и дает лучшую производительность, поэтому он должен быть предпочтительным, если только он не является используя другие модули, которые содержат потокобезопасные библиотеки (см. также это обсуждение или this на Serverfault).
Посмотрите этот для более подробной информации. Это относится к тому, как Apache обрабатывает несколько запросов. Предварительная загрузка, которая по умолчанию, запускает несколько процессов Apache (по умолчанию здесь по умолчанию, хотя я считаю, что это можно настроить через httpd.conf). Рабочий MPM запустит новый поток за запрос, который, как я полагаю, более эффективен с точки зрения памяти. Исторически сложилось так, что Apache использовал prefork, так что это более проверенная модель. Threading был добавлен только в версии 2.0.
Для CentOS 6.x и 7.x(включая Amazon Linux) используйте:
sudo httpd -V
Это покажет, какой из MPM настроен. Либо предпродак, рабочий, либо событие. Prefork - это более ранняя, потокобезопасная модель. Рабочий является многопоточным, а событие поддерживает php-mpm, который, как предполагается, является лучшей системой для обработки потоков и запросов.
Однако ваши результаты могут отличаться в зависимости от конфигурации. Я видел много нестабильности в php-mpm, а не улучшения скорости. Агрессивный паук может легко исчерпать максимальные дочерние процессы в php-mpm.
Настройки для предка, рабочего или события устанавливаются в 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
.