Apache構成ファイルを見ると、PreforkとWorkerMPMが定義されていることがわかります。違いは何ですか?Apacheはどちらを使用していますか?
7 に答える
Preforkとworkerは、MPMapacheが提供する2つのタイプです。どちらにも長所と短所があります。
デフォルトでは、mpmはスレッドセーフなプリフォークです。
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)。
これらは他のApacheモジュールと同じですが、常に1つだけのMPMをサーバーにロードする必要がある点が異なります。MPMは構成中に選択され、configureスクリプトで引数を使用してサーバーにコンパイルされます。ここで、は目的のMPMの名前です。--with-mpm=NAME
NAME
Apacheは、コンパイル時に別のMPMが選択されない限り、オペレーティングシステムごとにデフォルトのMPMを使用します(たとえば、Windowsではmpm_winnt
デフォルトで使用されます)。オペレーティングシステムとそのデフォルトのMPMのリストは次のとおりです。
- BeOS
beos
- Netware
mpm_netware
- OS / 2
mpmt_os2
- Unix / Linux
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
-常に利用可能なコアApacheHTTPサーバー機能mpm_common
-複数のマルチプロセッシングモジュール(MPM)によって実装されるディレクティブのコレクションbeos
-このマルチプロセッシングモジュールはBeOS用に最適化されています。event
-標準ワーカーMPMの実験的なバリアントmpm_netware
NovellNetWare用に最適化された専用スレッドWebサーバーを実装するマルチプロセッシングモジュールmpmt_os2
OS / 2用のハイブリッドマルチプロセス、マルチスレッドMPMprefork
スレッド化されていない、フォーク前のWebサーバーを実装しますmpm_winnt
-このマルチプロセッシングモジュールは、WindowsNT用に最適化されています。worker
-ハイブリッドマルチスレッドマルチプロセスWebサーバーを実装するマルチプロセッシングモジュール
さて、との違いprefork
にworker
。
Apache 1.3と同様の方法でリクエストを処理する、スレッド化されていないプリフォークWebサーバーを実装します。スレッドセーフでないライブラリとの互換性のためにスレッド化を回避する必要があるサイトに適しています。また、各リクエストを分離するのに最適なMPMであるため、単一のリクエストに関する問題が他のリクエストに影響を与えることはありません。
worker
MPMは、ハイブリッドマルチプロセスマルチスレッドサーバーを実装し、パフォーマンスを向上させるため、スレッドセーフでないライブラリを含む他のモジュールを使用している場合を除いて、MPMを使用することをお勧めします(Serverfaultに関するこの説明またはこれも参照してください)。
詳細については、これをご覧ください。これは、Apacheが複数の要求を処理する方法を指します。デフォルトであるプリフォークは、いくつかのApacheプロセスを開始します(ここではデフォルトで2つですが、httpd.confを介してこれを構成できると思います)。ワーカーMPMは、リクエストごとに新しいスレッドを開始します。これは、メモリ効率が高いと思います。歴史的に、Apacheはpreforkを使用していたため、より適切にテストされたモデルです。スレッド化は2.0でのみ追加されました。
CentOS 6.xおよび7.x(Amazon Linuxを含む)の場合、以下を使用します。
sudo httpd -V
これにより、どのMPMが構成されているかがわかります。プレフォーク、ワーカー、またはイベントのいずれか。Preforkは、以前のスレッドセーフモデルです。ワーカーはマルチスレッドであり、イベントは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の言及を探します
RHEL7上のApache2.4でpreforkまたはworkermpmを簡単に切り替えることができます
を実行して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はプリフォークモード、つまりスレッド化されていないプリフォークWebサーバーで構成されています。つまり、各Apache子プロセスには単一のスレッドが含まれ、一度に1つの要求を処理します。そのため、より多くのリソースを消費します。
Apacheには、ApacheをマルチプロセスのマルチスレッドWebサーバーに変えるワーカーMPMもあります。ワーカーMPMは、それぞれ多くのスレッドを持つ複数の子プロセスを使用します。