回答:
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にアクセスしてください。
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
mpm_netware
mpmt_os2
prefork
(アップデート 2.4≥Apacheのバージョン: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
-常に利用可能なコアApache HTTP Server機能mpm_common
-複数のマルチプロセッシングモジュール(MPM)によって実装されるディレクティブのコレクションbeos
-このマルチプロセッシングモジュールはBeOS用に最適化されています。event
-標準ワーカーMPMの実験的バリアントmpm_netware
Novell NetWare用に最適化された、排他的にスレッド化されたWebサーバーを実装するマルチプロセッシングモジュールmpmt_os2
OS / 2用のハイブリッドマルチプロセス、マルチスレッドMPMprefork
スレッド化されていない、分岐前のWebサーバーを実装します。mpm_winnt
-このマルチプロセッシングモジュールは、Windows NT用に最適化されています。worker
-ハイブリッドマルチスレッドマルチプロセスWebサーバーを実装するマルチプロセッシングモジュールさて、との差にprefork
とworker
。
Apache 1.3と同様の方法でリクエストを処理する、スレッド化されていない、分岐前のWebサーバーを実装します。非スレッドセーフライブラリとの互換性のためにスレッド化を回避する必要があるサイトに適しています。また、各要求を分離するのに最適なMPMであるため、単一の要求の問題が他の問題に影響することはありません。
worker
MPMの実装ハイブリッドマルチプロセス、マルチスレッド・サーバー及びより良好な性能を与え、一方が(参照、非スレッドセーフなライブラリを含む他のモジュールを使用していない限り、それゆえそれが好まれるべきこの議論又はこれを serverfaultの上)。
詳細については、こちらをご覧ください。これは、Apacheが複数の要求を処理する方法を指します。デフォルトのプリフォークは、いくつかのApacheプロセスを開始します(ここではデフォルトで2つですが、httpd.confでこれを構成できると思います)。ワーカーMPMはリクエストごとに新しいスレッドを開始しますが、これはメモリ効率が向上すると思います。歴史的に、Apacheはpreforkを使用していたため、よりテストされたモデルです。スレッド化は2.0でのみ追加されました。
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
次のコマンドを発行すると、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
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
Apacheには2種類のMPM(マルチプロセッシングモジュール)が定義されています。
1:プリフォーク2:ワーカー
デフォルトでは、Apackeはpreforkedモード、つまりスレッド化されていないpre-fork Webサーバーに設定されています。つまり、各Apache子プロセスには単一のスレッドが含まれ、一度に1つの要求を処理します。そのため、より多くのリソースを消費します。
Apacheには、Apacheをマルチプロセス、マルチスレッドのWebサーバーに変えるワーカーMPMもあります。ワーカーMPMは、それぞれ多くのスレッドを持つ複数の子プロセスを使用します。