httpd.conf – MPM関連パラメータ

今回はApacheのprefork(mpm_event_module)の設定です。

おさらいしておくと、Apacheには動作モードが3つ(昔は2つだった)あって、

・prefork
・worker
・event

となってます。

現在のApache 2.4系のデフォルトは「event」です。
…と言われていますが、それはソースからmake installした場合の話です。

面倒だし特別な事情がなけりゃ普通はyumりますよね?
そんな時はpreforkでインストールされるみたいです。

Apacheの動作モードの違い

それぞれ何が違うかっていうとリクエストの捌き方が異なります。
preforkはシングルスレッドで動作します。(開発当初、世間のPCにマルチスレッドのプロセッサなんてほとんどなかったので当然といえば当然です)

workerとeventはマルチスレッドで動作するので効率もよく、サーバのCPUリソースも活用できるのですが色々と大人の事情でpreforkを使わざるを得ない状況も多々あります。

WEBサーバはApache本体だけで動いているわけじゃありません。様々なモジュールで機能拡張しています。例えばmod_phpとか。PHPが使えないWEBサーバって…厳しいですよね?しかし、mod_phpのmbstring系はシングルスレッドで動作します(というかマルチスレッドで動作しない)。なのでマルチバイト文字列をPHPで扱う場合なんかはprefork一択になってしまいます。

これを回避させるためにPHPをモジュール版(mod_php)ではなくCGIとして稼働させる手もありますが、その件については後日…。(ちなみにこのサーバはeventモード&CGI版PHPで動作してます)

とりあえずこれだけは設定しとく

preforkに話を戻すと、いくらシングルスレッドっていってもユーザーのアクセスは順番にリクエストされたりはしません。まとめて同時にきたりとか、普通にします。そこでApacheさんは同時にリクエストがきても大丈夫なように自分自身(httpdプロセス)をfork(クローンとか分身の術だと思えばいいです)して、受付係を何人も準備しておきます。マクドの注文カウンターみたいなもんです。

この注文カウンターに何人分の分身を配置するかの設定がhttpd.conf内のpreforkの設定です。
※今回は既にApacheがpreforkで動いてるものとして説明します。

主な設定項目は以下の通り。

ServerLimit

子プロセス数の上限(余談ですがeventやworkerの場合はCPUのコア数でいいかと思ってます)

StartServers

サーバ起動時の子プロセス数

MinSpareServers

アイドルな子プロセスの最小数(prefork用のディレクティブ?WorkerやEventではあんまり意味がなさそう)

MaxSpareServers

アイドルな子プロセスの最大数

MaxRequestWorkers

最大同時リクエスト数(2.2系ではMaxClientsというディレクティブでした)

MaxConnectionsPerChild

子プロセスが稼働中に扱うリクエスト数の上限(2.2系ではMaxRequestsPerChild)→「0」で上限なし

最低でもここにあげた項目はチェックと言うかhttpd.confに明示的に記述しておくべきです。
でないと後でサーバをメンテするエンジニアがサーバの設計根拠をイメージできません。

あと、たまに子プロセスとスレッドをごっちゃにして話をする猿人がいますが全然別物です。
さっきのマクドの話でいくと子プロセスってのはクローン店員のことで、スレッドっつーのはその店員が聖徳太子みたいに同時にどんだけの客を応対できるか…のことです。

私のワケのわかんない例えより、こっちの方が詳しくてわかりやすいと思うw
https://imokuri123.com/blog/2013/12/difference-between-process-and-thread.html

書いては見たものの

しかし、世間的にはGさんがhttp/2使えとか言ってるのでpreforkで動くApacheはどんどん減少するはずです。(→ 昨夏のセキュリティ対策リリース以降はmod_http2というモジュールがpreforkで使えないため)

通信パフォーマンスの観点からも今後はeventモードでApacheを動かすようにするべきだと思います。