PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例

PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例

Posted at January 29,2007 1:55 AM
Tag:[Apache, Performance, PHP]

PHP のパフォーマンスを調べる中で「モジュール版」と「CGI版」という言葉をみつけまして、本エントリーではそれぞれの内容、およびパフォーマンス・セキュリティ等の観点で両者を比較してみました。
併せて、PHP プログラムである WordPress を適用した場合について示しています。

Web サーバは Apache を対象にしています。内容について認識誤り等ありましたらご指摘ください。

1.用語

まず最初に「CGI版」と「モジュール版」の意味について記します。

[CGI 版]
CGI」は「Common Gateway Interface」の略で、サーバが受信したブラウザの要求に応じてプログラムを起動するための仕組みを指します。PHP の場合、ブラウザに

http://~/xxx.php

を URL として指定した場合、Webサーバは xxx.php を実行ファイルと認識してプログラムを起動し、その実行結果を返却します。これを「CGI 版」と言うようです。

[モジュール版]
「モジュール」とは、Apache の機能を拡張するための「部品」(と考えるのが分かりやすそうです)。PHP もこのモジュールを利用することで Apache の一機能として PHP を動作させることができます。
つまり「モジュール版」とは、この Apache の拡張モジュールを利用していることを指すようです。

下記のサイトの「補足2 モジュールとは」にモジュールのイメージが掲載されています。

PHP5 + Apache(Windows)の httpd.conf の設定に着目した場合、下記の違いがあります。

CGI 版として利用する場合の設定

ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php-cgi.exe"

モジュール版として利用する場合の設定

LoadModule php5_module "c:/php/php5apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php"

PHP の MIME タイプはいずれも AddType ディレクティブで、.php という拡張子を指定されたコンテントタイプ application/x-httpd-php にマップしていますが、CGI 版は Action ディレクティブで CGI を実行するように設定、モジュール版は LoadModule ディレクティブにより、ライブラリ php5apache2.dll を Apache のが利用可能なモジュール php5_module として追加しています。

2.パフォーマンスによる比較

PHP 公式サイトのトップページに次のような記述があります。

日本 PHP ユーザ会:PHPについて

通常のCGIとして使用できますが、PHPモジュールをApacheサーバーに組み込むことにより、 Perl/CGIと比較して処理速度の高速化、サーバー負荷の低減が可能です。

明らかに「CGI 版」より「モジュール版」のパフォーマンスが上回っているようです。

1項の説明で「CGI 版」「モジュール版」いずれも PHP プログラムを起動することには違いないのですが、モジュール版 のパフォーマンスが良いのは下記の違いによるようです。

  • CGI 版:PHPプログラムが呼び出されるたびにプロセスが1つ立ち上がる
  • モジュール版:Apacheのプロセスの中で実行されるため、余分なプロセスを立ち上げる必要がない

プロセスの説明は省略しますが、下記の記事の「仕組みはどうなっているのか」に分かりやすい説明があります。

ということで、パフォーマンス面では「モジュール版」が断然有利で、WordPress でもモジュール版の利用がお勧めです。

3.セキュリティによる比較

共有レンタルサーバの PHP モジュール版には「セーフモード」と呼ばれる設定が施されています。
「セーフモード」とは、共有サーバでのセキュリティの問題を解決するための仕組みで、例えば、同一サーバの他のユーザが自ユーザのファイルを参照できないようにすることができます。

この制限により、例えば WordPress では、ブラウザの管理画面でファイル操作を行う場合等に影響があるようです。これはブラウザから実行した時のユーザ ID がサーバ上のユーザ ID と異なるためで、この操作がセーフモードにひっかかってしまうようです。

CGI 版の場合、「suEXEC」という機能を利用します。これは Apache で Web サーバを実行しているユーザ ID とは 異なるユーザ ID(それぞれのコンテンツユーザーの権限)で CGI プログラムや SSI プログラムを実行する機能です。これによりセキュリティを確保しているようです。

Xrea(エクスリア) は PHP モジュール版が利用できるレンタルサーバですが、セーフモードが設定されています。上記の影響を回避するには特定の機能を CGI 版として利用します。

不具合を回避する方法の詳細等につきましては下記のリンクを参照ください。

4.レンタルサーバで CGI 版が利用される理由

上記までの比較では、ユーザの立場としては「モジュール版」の利用が有利ですが、さくらインターネット等のレンタルサーバで CGI 版が提供されているのは、ひとつには下記の理由があるようです。

DreamHostのカタチ ?良い鯖.com?PHP について

Apache module版だと、Dreamhost管理人がユーザごとの PHP 負荷を計測するのが不可能なのが原因

つまり、共有レンタルサーバ運営サイドとしては、メンテナンス面でCGI 版が勝っているのではないかと考えます。この辺りは詳細な調査ができておりませんので私の推測が間違っているかもしれませんし、逆に正確な情報を頂ければという思惑も含んでいます。

5.まとめ

項目は色々あると思いますが、とりあえず上記までの内容とその他思いついた項目でまとめてみました。

項目CGI 版モジュール版(Apache モジュール)
実行プロセスPHP のプロセスApache のプロセス
レスポンス遅い速い
サーバ負荷多い少ない
セキュリティsuExecセーフモード
ファイルのパーミッション775/777等604等
メンテナンス 負荷計測が不可能?
その他 システム系などの一部の関数が使用不可

6.CGI 版からモジュール版に乗り換えた例

最近では、WordPress ユーザの caramel*vanilla さんが、さくらのレンタルサーバ(CGI 版)から XREA+(モジュール版)に乗り換えられました。多発していた 503 エラーが解消され、アクセスも快適になっています。

7.その他

未整理の関連リンクです。

関連記事
トラックバックURL


トラックバック

lowest airfares from cheap airfare
?????????ヲ??????? [続きを読む]

Tracked on February 15, 2007 9:51 PM

last minute airfare from cheap airfare
?????????ヲ??????? [続きを読む]

Tracked on February 15, 2007 9:57 PM

PHPのモジュール版とCGI版って何。 from metabolism
 前のエントリに続き、またもやinetd利用者限定に近い話。もしかしたら他のレン... [続きを読む]

Tracked on December 16, 2007 5:08 PM
コメント

当方ITは素人ですが、勉強しながらPHP+MySQLでWebサイト構築を目指すものです。PHPダウンロードに際して、こちらのサイトはCGI版、モジュール版のメリット・デメリットを丁寧に解説してくださっていたので、とても参考になしました。(私はモジュール版を選びました。)とても良いサイトなので私以外の方にも紹介いとの思いから、真に勝手ながら、私のブログにリンクを貼らせていただきました。
http://d.hatena.ne.jp/fowlmouth/
もしご迷惑でしたらすぐ削除しますので、お手数ですがご一報いただきますようお願いいたします。

[1] Posted by Fowlmouth : August 24, 2010 12:03 AM

>Fowlmouthさん
こんばんは。
リンクの件、ご連絡ありがとうございました。
ご紹介くださり、大変光栄に存じます。
これからもよろしくお願いいたします。

[2] Posted by yujiro logo : August 24, 2010 2:48 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)