Apache MPM:prefork と worker の違い
詳しく解説されているサイトがありましたので、いろいろ読ませていただいたところ、prefork は、リクエストに対して、子プロセスを起動するので時間がかかりメモリを消費する、一方 worker は、1プロセスがいくつものスレッドを持っており、それぞれがリクエストに応えるので、メモリ消費量も少なくパフォーマンスも良いということのようです。
参考にさせていただいたサイトです。
曖昧スラッシュ » Apacheのpreforkとworker
apache2.0のMPM ( Multi Processing Module ) とは – end0tknrのkipple – web写経開発
ということで、worker で動作させようと思いますと、phpをcgiで動かすか、スレッドセーフでコンパイルし直すということになりますね。
Apache2 の MPM マルチスレッドモードを実運用環境で使用することは非推奨?
ところが、PHP: Apache 2.x (Unixシステム用) – Manual を見てみましたら、いきなり
警告
Apache2 の MPM マルチスレッドモードを実運用環境で使用することは推奨されません。 代わりに prefork MPM を使ってください。これは Apache 2.0 および 2.2 におけるデフォルトの MPM です。prefork MPM を使う理由については、 マルチスレッド版 MPM の Apache2の FAQ エントリを参照してください。
こんな警告に出会ってしまいました。
で、FAQを見てみますと、何だか難しいのですが、要は「マルチスレッドモードで php を動かすことは危険ですよ。どうしてもそうしたければ、FastCGIを使ってね。」ということのようです。
phpをCGIで動かす
ここは素直にしたがって、CGI で動かすことにしましょう。以前はモジュールで動かしていましたので、CGI は初めてになりますが、よく利用しているさくらのレンタルサーバの php も CGI で動いていますので、いい勉強になるかも知れません。
まずは、デフォルト設定でCGI が動くのか調べてみますと、Apache2.4では、モジュールの組み込みがコメントアウトされているようですので、外して組み込みます。
LoadModule cgid_module lib/httpd/modules/mod_cgid.so
そして、CGI 設定の段取りは、
- 拡張子.php が cgi ファイルであると指定する
- cgi ファイルがリクエストされた時に実行するプログラムを指定する
- /usr/bin/php-cgi のシンボルリンクを cgi-bin ディレクトリに置く
こんな感じで行けそうですので、
# ln -s /usr/bin/php-cgi /srv/httpd/cgi-bin/php
として、httpd.conf に以下を追加します。
<Directory /srv/httpd/cgi-bin>
Options +FollowSymLinks
</Directory>AddHandler cgi-handler .php
Action cgi-handler /cgi-bin/php
で、apache を再起動しようとしましたら怒られてしまいました。
AH00526: Syntax error on line 510 of /etc/httpd/httpd.conf:
Invalid command ‘Action’, perhaps misspelled or defined by a module not included in the server configuration
action モジュールもコメントアウトされているんですね。コメントアウトを外して、
LoadModule actions_module lib/httpd/modules/mod_actions.so
再起動しますと、CGI モードで走っている php が確認できました。
Server API | CGI/FastCGI |
ということで問題ないとは思うのですが、いろいろググっている途中で、
How to install Apache 2 with PHP 5 as a CGI を発見し、
ScriptAlias /local-bin/ “/usr/bin/”
AddHandler cgi-handler .php
Action cgi-handler /local-bin/php-cgi
<Directory “/usr/bin”>
Require all granted
</Directory>
この設定でもいけるようです。これですと、php-cgi のシンボルリンクはいらなくなりますね。
ということで、次は mysql といきたいところですが、CGI 設定の過程で、またも警告に出会ってしまいました。
警告
CGI モードで公開したサーバーは、いくつかの脆弱性の標的となる可能性があります。 これらの攻撃からサーバーを守る方法については、 CGI セキュリティ のセクションを参照してください。
さらに、
CGI版PHPに対する魔法少女アパッチマギカ攻撃を観測しました | 徳丸浩の日記なんて記事もあります。
ああ、難しい! それに、FastCGI ってのも調べなくてはなりません。