Apache Prefork対Worker MPM


113

Apache構成ファイルを見ると、PreforkとWorker MPMが定義されています。何が違い、どれがApacheで使用されていますか?

回答:


120

Preforkとworkerは、Apacheが提供するMPMの2つのタイプです。どちらにも長所と短所があります。

デフォルトでは、mpmはスレッドセーフなpreforkです。

Prefork MPMは複数の子プロセスをそれぞれ1つのスレッドで使用し、各プロセスは一度に1つの接続を処理します。

ワーカーMPMは、それぞれ多くのスレッドを持つ複数の子プロセスを使用します。各スレッドは一度に1つの接続を処理します。

詳細については、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
Nazariy

@arvind //各スレッドは一度に1つの接続を処理します//ここでの接続は、単一のユーザーまたは単一の要求を意味しますか?plsの説明
user1844933

21

Apacheのマルチプロセッシングモジュール(MPM)は、マシンのネットワークポートへのバインド、要求の受け入れ、および要求を処理するための子のディスパッチ(http://httpd.apache.org/docs/2.2/mpm.html)を担当します。

これらは、常に1つだけのMPMをサーバーにロードする必要があることを除いて、他のApacheモジュールと同じです。MPMは構成時に選択され--with-mpm=NAME、configureスクリプトで引数を使用してサーバーにコンパイルされますNAME。ここで、は目的のMPMの名前です。

コンパイル時に別のMPMが選択されない限り、ApacheはオペレーティングシステムごとにデフォルトのMPMを使用します(たとえば、Windowsではmpm_winntデフォルトで使用されます)。オペレーティングシステムとそのデフォルトのMPMのリストを次に示します。

  • BeOS beos
  • ネットウェア mpm_netware
  • OS / 2 mpmt_os2
  • UNIX / Linuxの preforkアップデート 2.4≥Apacheのバージョンpreforkworker、または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 -常に利用可能なコアApache HTTP Server機能
  • mpm_common -複数のマルチプロセッシングモジュール(MPM)によって実装されるディレクティブのコレクション
  • beos -このマルチプロセッシングモジュールはBeOS用に最適化されています。
  • event -標準ワーカーMPMの実験的バリアント
  • mpm_netware Novell NetWare用に最適化された、排他的にスレッド化されたWebサーバーを実装するマルチプロセッシングモジュール
  • mpmt_os2 OS / 2用のハイブリッドマルチプロセス、マルチスレッドMPM
  • prefork スレッド化されていない、分岐前のWebサーバーを実装します。
  • mpm_winnt -このマルチプロセッシングモジュールは、Windows NT用に最適化されています。
  • worker -ハイブリッドマルチスレッドマルチプロセスWebサーバーを実装するマルチプロセッシングモジュール

さて、との差にpreforkworker

preforkMPM

Apache 1.3と同様の方法でリクエストを処理する、スレッド化されていない、分岐前のWebサーバーを実装します。非スレッドセーフライブラリとの互換性のためにスレッド化を回避する必要があるサイトに適しています。また、各要求を分離するのに最適なMPMであるため、単一の要求の問題が他の問題に影響することはありません。

workerMPMの実装ハイブリッドマルチプロセス、マルチスレッド・サーバー及びより良好な性能を与え、一方が(参照、非スレッドセーフなライブラリを含む他のモジュールを使用していない限り、それゆえそれが好まれるべきこの議論又はこれを serverfaultの上)。


1
Apache 2.4.7のubuntu-trusty-64のデフォルトインストールでは、イベントMPMを使用しています
フェデリコ

9

詳細については、こちらをご覧ください。これは、Apacheが複数の要求を処理する方法を指します。デフォルトのプリフォークは、いくつかのApacheプロセスを開始します(ここではデフォルトで2つですが、httpd.confでこれを構成できると思います)。ワーカーMPMはリクエストごとに新しいスレッドを開始しますが、これはメモリ効率が向上すると思います。歴史的に、Apacheはpreforkを使用していたため、よりテストされたモデルです。スレッド化は2.0でのみ追加されました。


3
イベントMPMについてはどうですか?
Vince Kronlein 2013年

6

CentOS 6.xおよび7.x(Amazon Linuxを含む)の場合:

sudo httpd -V

これにより、構成されているMPMが表示されます。prefork、worker、またはeventのいずれか。Preforkは、以前のスレッドセーフモデルです。ワーカーはマルチスレッド化されており、イベントはphp-mpmをサポートしています。php-mpmは、スレッドとリクエストを処理するためのより優れたシステムであると考えられています。

ただし、結果は構成によって異なる場合があります。私はphp-mpmで多くの不安定性を目にしましたが、速度の向上は見られませんでした。攻撃的なスパイダーは、php-mpmで最大の子プロセスを非常に簡単に使い果たす可能性があります。

prefork、worker、またはeventの設定は、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モジュールでコンパイルできるため、これは常に信頼できるとは限りません。2つのMPMモジュールがリストされている場合apachectl -Vは、の横の出力を確認してくださいServer MPM。またはのps auxいずれかをチェックして探すこともできます。httpdhttpd.worker
reflexiv 2014

2
私の場合、apache2ctl -lうまくいきませんでした。使用する必要がありましたapachectl -l
Vacilando 2015年

2
それらのどれも私にはリストされていませんが、Apacheは正常に動作します、Apache / 2.4.7(Ubuntu)
karatedog

2
Apacheの2.4.6を実行しているCentOSの7.xでは、httpd -Vのようなものを与える:Server MPM: worker
runamok

2

RHEL7上のApache 2.4でpreforkまたはworker mpmを簡単に切り替える

実行して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を使用しようとしたときにページが機能しない理由
Leoh

0

Apacheには2種類のMPM(マルチプロセッシングモジュール)が定義されています。

1:プリフォーク2:ワーカー

デフォルトでは、Apackeはpreforkedモード、つまりスレッド化されていないpre-fork Webサーバーに設定されています。つまり、各Apache子プロセスには単一のスレッドが含まれ、一度に1つの要求を処理します。そのため、より多くのリソースを消費します。

Apacheには、Apacheをマルチプロセス、マルチスレッドのWebサーバーに変えるワーカーMPMもあります。ワーカーMPMは、それぞれ多くのスレッドを持つ複数の子プロセスを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.