PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例
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 版として利用します。
不具合を回避する方法の詳細等につきましては下記のリンクを参照ください。
- Numb.:XREA で WordPress のファイルアップロード機能を CGI として動かす
- PHP小屋:PHPスクリプト設置者のための豆知識
- hiromasa.zone :o):セーフモードの束縛
- Wordpress ME 2.0 - Docs:キャッシュ機能の利用(セーフモードでキャッシュ機能を利用する場合の設定)
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.その他
未整理の関連リンクです。
- XREA SUPPORT BOARD:public_html内のPHPのモジュール化
- PHP5.0/2.Apache2の設定
- MIME Media Types
- Apache 2.0 モジュール一覧
- PHPのインストール(Apache2.0 Linux編)
- PHP マニュアル
- PHP マニュアル:Apache 2.0 (Unixシステム用)
- PHPをビルドしてApacheと連携させる方法
- ApacheのCGIでソースが表示される場合の対処
- Apache 2.4 系をソースからインストール
- 「php_flag short_open_tag off」の意味
- mod_rewriteの動作を確認する方法
- WindowsにApacheを簡単にインストールする方法
- Windows+ApacheでSSLを有効にする方法
- Apacheログのリクエスト時間にミリ秒・マイクロ秒を表示する
- Windows + XAMPP + OpenSSL
- Apache のチューニング(その3)・DiceによるWindows再起動
- Apache のチューニング(その2)
- Apache のチューニング(その1)
≫ lowest airfares from cheap airfare
?????????ヲ??????? [続きを読む]
≫ last minute airfare from cheap airfare
?????????ヲ??????? [続きを読む]
≫ PHPのモジュール版とCGI版って何。 from metabolism
前のエントリに続き、またもやinetd利用者限定に近い話。もしかしたら他のレン... [続きを読む]
当方ITは素人ですが、勉強しながらPHP+MySQLでWebサイト構築を目指すものです。PHPダウンロードに際して、こちらのサイトはCGI版、モジュール版のメリット・デメリットを丁寧に解説してくださっていたので、とても参考になしました。(私はモジュール版を選びました。)とても良いサイトなので私以外の方にも紹介いとの思いから、真に勝手ながら、私のブログにリンクを貼らせていただきました。
http://d.hatena.ne.jp/fowlmouth/
もしご迷惑でしたらすぐ削除しますので、お手数ですがご一報いただきますようお願いいたします。
>Fowlmouthさん
こんばんは。
リンクの件、ご連絡ありがとうございました。
ご紹介くださり、大変光栄に存じます。
これからもよろしくお願いいたします。