apache で fcgid,fastcgi(PHP-FPM) を使うなら PreforkからWorkerへ切り替えるべし。
apache には、プロセス管理の方法(マルチプロセッシングモジュール (MPM))として プロセス制御(Prefork)、 スレッド制御(Worker) と2つの方法があります。
この2つの違いを単純に言うと
Preforkが、プロセス毎にクライアントからの要求をさばいていくのに対して、
Workerは、スレッド毎にクライアントからの要求をさばいていく
というところ(厳密にはもっと違います)でしょうか。
プロセスよりスレッドの方が、よりリソースを効率的に使用できることは、プログラマーの方なら良くご存じのことだと思います。
ただ、Apacheをインストールするとデフォルトでは、Preforkを使用することになります。
Workerのメリットが大きいにも関わらず、デフォルト動作は、Preforkなんですね。
それは、Workerを使用するときに気を付けることがあるからでもあります。
Workerは先にも書いたようにスレッド管理されます。
つまり、Apacheに関連して使用するモジュールがスレッドセーフでないといけないということになります。
そのため、php + apache のメモリ量をおさえる(2) workerを使ってみる では、phpモジュールを使いたいがために、phpをスレッドセーフで再構築(make)しています。
しかし、PHP-FPMを使う場合、phpモジュール版のようにApacheプロセスの中で動作しない(別プロセス)ですから、
Workerがそのまま利用できることになります。
そこで、以下の記事で解説しているように PHP-FPM を使うなら、ApacheのWorkerを使わない手はないわけです。
今回は、そのApacheのWorkerへPreforkから切りける方法について解説してみます。
apache で PreforkからWorkerへ切り替える
ディストリビューションによって異なりますので、それぞれについて解説しておきます。
Debian,
Ubuntu
Debian,Ubuntuでは、Workerのバイナリパッケージがありますので、それをインストールすることで切り替えます。
$ aptitude install apache2-mpm-worker
以下の新規パッケージがインストールされます:
apache2-mpm-worker{b}
更新: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
アーカイブ 2,234 B 中 0 B を取得する必要があります。展開後に 69.6 kB のディスク 領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
apache2-mpm-prefork: 競合: apache2-mpm[仮想パッケージです]
apache2-mpm-worker: 競合: apache2-mpm[仮想パッケージです]
以下のアクションでこれらの依存関係の問題は解決されます:
以下のパッケージを削除する:
1) apache2-mpm-prefork
2) libapache2-mod-php5
この解決方法を受け入れますか? [Y/n/q/?] Y
以下の新規パッケージがインストールされます:
apache2-mpm-worker
以下のパッケージが削除されます:
apache2-mpm-prefork{a} libapache2-mod-php5{a}
更新: 0 個、新規インストール: 1 個、削除: 2 個、保留: 0 個。
アーカイブ 2,234 B 中 0 B を取得する必要があります。展開後に 8,926 kB のディスク領域が解放されます。
先に進みますか? [Y/n/?] Y
(データベースを読み込んでいます ... 現在 39823 個のファイルとディレクトリがイン ストールされています。)
libapache2-mod-php5 を削除しています ...
Module php5 already disabled
dpkg: apache2-mpm-prefork: 依存関係に問題があります。しかし要求に従い削除してい ます:
apache2 は以下に依存 (depends) します: apache2-mpm-worker (= 2.2.16-6+squeeze11) | apache2-mpm-prefork (= 2.2.16-6+squeeze11) | apache2-mpm-event (= 2.2.16-6+squeeze11) | apache2-mpm-itk (= 2.2.16-6+squeeze11) ...しかし:
パッケージ apache2-mpm-worker はまだインストールされていません。
パッケージ apache2-mpm-prefork は削除されようとしています。
パッケージ apache2-mpm-event はまだインストールされていません。
パッケージ apache2-mpm-itk はまだインストールされていません。
apache2-mpm-prefork を削除しています ...
Stopping web server: apache2 ... waiting .
未選択パッケージ apache2-mpm-worker を選択しています。
(データベースを読み込んでいます ... 現在 39814 個のファイルとディレクトリがイン ストールされています。)
(.../apache2-mpm-worker_2.2.16-6+squeeze11_i386.deb から) apache2-mpm-worker を 展開しています...
apache2-mpm-worker (2.2.16-6+squeeze11) を設定しています ...
Starting web server: apache2.
|
Debian,Ubuntuでは、prefork版(apache2-mpm-prefork)が削除され、自動的に再起動します。
(上記のようにphpのスレッドセーフでないPHPモジュールもインストールされている場合は、削除されます。)
これだけで、切替完了です。
CentOS,
ScientificLinux
CentOS,ScientificLinuxでは、
デフォルトでインストールしたhttpd(apache)にPreforkもWorkerもいずれの機能も同梱されています。
そのため、/etc/sysconfig/httpd の設定を変更するだけです。
...
# コメントアウトされているので、先頭の # を削除すればOKのはずです。無ければ記述してください。
HTTPD=/usr/sbin/httpd.worker
...
|
編集を終えたら、httpd(apache)を再起動します。
$ /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
|
これだけで、切替完了です。
apache で PreforkからWorkerへ切り替わったか確認する
apache で PreforkからWorkerへ切り替わったか確認するには、以下のようにタイプすれば確認できます。
$ apachectl -V | grep 'Server MPM'
Server MPM: Worker
|
上記のように Worker と出力されれば、ちゃんと設定が切り替わっています。
もし、正しく切り替わっていない場合は、以下のようにPrefork と出力されます。
$ apachectl -V | grep 'Server MPM'
Server MPM: Prefork
|
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :