読者です 読者をやめる 読者になる 読者になる

@半径とことこ60分

人間の認知範囲なんてそんなもんさと、鳥が囀った

Plamo-5.2/apache+phpをCGIで動かす(完了なのだが…)

Apache MPM:prefork と worker の違い

詳しく解説されているサイトがありましたので、いろいろ読ませていただいたところ、prefork は、リクエストに対して、子プロセスを起動するので時間がかかりメモリを消費する、一方 worker は、1プロセスがいくつものスレッドを持っており、それぞれがリクエストに応えるので、メモリ消費量も少なくパフォーマンスも良いということのようです。

参考にさせていただいたサイトです。
曖昧スラッシュ » Apacheのpreforkとworker
apache2.0のMPM ( Multi Processing Module ) とは - end0tknrのkipple - web写経開発

ということで、worker で動作させようと思いますと、phpcgiで動かすか、スレッドセーフでコンパイルし直すということになりますね。

 

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を使ってね。」ということのようです。

 

 phpCGIで動かす

ここは素直にしたがって、CGI で動かすことにしましょう。以前はモジュールで動かしていましたので、CGI は初めてになりますが、よく利用しているさくらのレンタルサーバphpCGI で動いていますので、いい勉強になるかも知れません。

まずは、デフォルト設定でCGI が動くのか調べてみますと、Apache2.4では、モジュールの組み込みがコメントアウトされているようですので、外して組み込みます。

LoadModule cgid_module lib/httpd/modules/mod_cgid.so

そして、CGI 設定の段取りは、

  1. 拡張子.phpcgi ファイルであると指定する
  2. cgi ファイルがリクエストされた時に実行するプログラムを指定する
  3. /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 設定の過程で、またも警告に出会ってしまいました。

PHP: CGI およびコマンドライン - Manual

警告

CGI モードで公開したサーバーは、いくつかの脆弱性の標的となる可能性があります。 これらの攻撃からサーバーを守る方法については、 CGI セキュリティ のセクションを参照してください。

さらに、

CGI版PHPに対する魔法少女アパッチマギカ攻撃を観測しました | 徳丸浩の日記なんて記事もあります。

ああ、難しい! それに、FastCGI ってのも調べなくてはなりません。