目次
- 0. Webサーバーの動的コンテンツ処理の必要性
- 1. CGIの技術仕様
- 1.1. CGIの定義
- 1.2. CGIの動作メカニズム
- 1.3. CGIの特性と限界
- 1.4. CGIの適用シナリオ
- 2. FastCGIの技術仕様
- 2.1. FastCGIの概要
- 2.2. FastCGIの動作原理
- 2.3. プロセス管理戦略
- 2.4. FastCGIの技術的特徴
- 2.5. FastCGIの実装例
- 2.6. CGIとFastCGIの比較
- 3. PHP実装の各種方式
- 3.1. PHP-CGIの仕組み
- 3.2. PHP-FPMのアーキテクチャ
- 3.3. Spawn-FCGIの特徴
- 3.4. 各方式の性能比較
- 4. PHPの実行モード
- 4.1. CLIモード
- 4.2. CGIモード
- 4.3. FastCGIモード
- 4.4. ISAPIモード
- 4.5. Apacheモジュールモード
- 4.6. 各モードの比較
0. Webサーバーの動的コンテンツ処理の必要性
Webサーバー(nginx、apache等)はクライアントからのリクエストに応答するコンテンツ配信サーバーとして機能します。静的リソース(HTML、CSS、画像等)の場合、サーバーはファイルシステムから対応するファイルを検索し、クライアントに直接返します。
しかし、PHPファイルのような動的コンテンツの場合、Webサーバーは単独で処理できず、PHPインタープリターなどの外部プログラムを起動してコンテンツを生成し、その結果をクライアントに転送する必要があります。
このWebサーバーとアプリケーション間の通信仕様を標準化するために、CGI(Common Gateway Interface)プロトコルが開発されました。
1. CGIの技術仕様
1.1. CGIの定義
CGI(Common Gateway Interface)は、Webサーバーと外部アプリケーション間のデータ通信を規定するプロトコル仕様です。URL、クエリ文字列、POSTデータ、HTTPヘッダーなどの情報を標準化された形式で伝送することを目的としています。
CGIプログラムは標準入力、標準出力、環境変数を使用する任意の言語(PHP、Perl、Python、C/C++等)で実装できます。言語に依存しない仕様により、CGI準拠のプログラムであればどの言語で実装されてもWebサーバーと連携可能です。
1.2. CGIの動作メカニズム
CGIの処理フローは以下のようになります:
- Webサーバーが動的リクエスト(例:.phpファイル)を受信
- 対応するCGIプログラム(PHPインタープリター)を新規プロセスとして起動
- CGIプログラムが設定ファイル(php.ini)を読み込み、実行環境を初期化
- リクエストを処理し、結果をCGI規定の形式でWebサーバーに出力
- CGIプロセスを終了
- Webサーバーが結果をクライアントに返信
1.3. CGIの特性と限界
パフォーマンスの問題:CGIの最大の欠点は、各リクエストごとに新しいプロセスを生成・終了するfork-and-executeモデルです。これにより以下の問題が発生します:
- プロセス生成・終了のオーバーヘッドが大きい
- 設定ファイルの再読み込みと環境初期化の繰り返し
- メモリ空間の共有が不可能でリソース効率が低い
セキュリティ考慮事項:各リクエストが独立プロセスで実行されるため、プロセス間の分離は確保されますが、プロセス管理の複雑さからセキュリティリスクが増加する可能性があります。
1.4. CGIの適用シナリオ
高負荷環境でのパフォーマンス制約により、CGIは主に開発・テスト環境や低トラフィックのシステムで利用されます。設定変更の即時反映が容易な特性から、デバッグ目的で重宝されます。
2. FastCGIの技術仕様
2.1. FastCGIの概要
FastCGI(Fast Common Gateway Interface)はCGIの性能問題を解決するために開発された改良版プロトコルです。永続的なプロセスプールを維持し、リクエストの処理効率を大幅に向上させます。
FastCGIはCGIと同様にWebサーバーとアプリケーション間の通信プロトコルですが、アーキテクチャは根本的に異なります。
2.2. FastCGIの動作原理
FastCGIの処理モデル:
- Webサーバー起動時にFastCGIプロセスマネージャー(php-fpm等)をロード
- プロセスマネージャーが設定に基づき複数のワーカープロセスを起動
- ワーカープロセスがリクエストを待機する永続的なプロセスプールを形成
- リクエスト受信時、プロセスマネージャーがアイドル状態のワーカーを選択
- Webサーバーが環境変数とリクエストデータをワーカーに転送
- ワーカーが処理完了後、結果をWebサーバーに返信
- ワーカーは次のリクエストを待機(プロセスは維持)
2.3. プロセス管理戦略
FastCGIのプロセス管理はマスター/ワーカーモデルを採用:
- マスタープロセス:設定ファイル管理、ワーカープロセスの生成・監視
- ワーカープロセス:実際のリクエスト処理を担当
- 動的スケーリング:負荷に応じてワーカー数を自動調整
- プロセス再利用:処理完了後もプロセスを維持し再利用
2.4. FastCGIの技術的特徴
言語独立性:FastCGIはC/C++、Java、PHP、Python、Ruby等、主要なプログラミング言語をサポートします。Apache、Nginx、lighttpd等の主要なWebサーバーとの互換性もあります。
アーキテクチャの分離:Webサーバーとアプリケーションサーバーの分離により:
- 個別のスケーリングが可能
- 障害分離が実現
- セキュリティ境界の明確化
- 分散システムの構築が容易
設定の動的反映:FastCGIは実行中のワーカープロセスを維持したまま、新規ワーカーに新しい設定を適用できます。これにより、サービスを停止せずに設定変更が可能です。
2.5. FastCGIの実装例
NginxとPHP-FPMの連携設定例:
# nginx.conf
server {
listen 80;
server_name example.com;
root /var/www/html;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
PHP-FPMのプール設定:
; www.conf
[www]
user = www-data
group = www-data
listen = /var/run/php/php8.0-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
2.6. CGIとFastCGIの比較
| 特性 | CGI | FastCGI |
|---|---|---|
| プロセスモデル | リクエスト毎に新規生成・終了 | 永続的なプロセスプール |
| パフォーマンス | 低い(プロセス生成オーバーヘッド) | 高い(プロセス再利用) |
| メモリ使用量 | 低い(一時的) | 高い(常駐プロセス) |
| スケーラビリティ | 制限あり | 高い |
| 設定反映 | 即時(プロセス再起動) | 段階的(ワーカー置換) |
3. PHP実装の各種方式
3.1. PHP-CGIの仕組み
PHP-CGIはCGIプロトコルを実装したPHPの実行プログラムです。基本的な起動方法:
# PHP-CGIの起動
php-cgi -b 127.0.0.1:9000 -q
# 設定ファイルを指定
php-cgi -c /etc/php/8.0/cli/php.ini -b 127.0.0.1:9000
PHP-CGIの特性:
- 設定変更にはプロセス再起動が必要
- プロセス終了でサービス停止
- 単一プロセスモデルのため並行処理に制限
3.2. PHP-FPMのアーキテクチャ
PHP-FPM(FastCGI Process Manager)はPHP公式のFastCGIプロセスマネージャーです。PHP 5.3.2以降、コア機能として統合されています。
主な特徴:
- プロセスマネジメント:動的なワーカープロセス制御
- 設定の柔軟性:プールごとの詳細設定
- 監視機能:ステータスページによる監視
- ログ機能:詳細なエラーログとアクセスログ
PHP-FPMのプール設定例:
[site1]
user = site1_user
group = site1_group
listen = /var/run/php/site1.sock
pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
slowlog = /var/log/php/slow-site1.log
request_slowlog_timeout = 5s
3.3. Spawn-FCGIの特徴
Spawn-FCGIはlighttpdプロジェクトから分離した独立したFastCGIプロセスマネージャーです。汎用的な設計で様々な言語のFastCGIアプリケーションを管理できます。
基本的使用方法:
# Spawn-FCGIでのPHP起動
spawn-fcgi -s /var/run/php.sock -u www-data -g www-data -P /var/run/spawn-fcgi.pid -C 5 -f /usr/bin/php-cgi
3.4. 各方式の性能比較
| 項目 | PHP-CGI | PHP-FPM | Spawn-FCGI |
|---|---|---|---|
| プロセス管理 | 手動 | 自動(高度) | 自動(基本) |
| メモリ効率 | 低い | 高い | 中程度 |
| 安定性 | 低い | 高い | 中程度 |
| 設定容易性 | 簡単 | 複雑 | 中程度 |
| 監視機能 | なし | 豊富 | 基本 |
4. PHPの実行モード
4.1. CLIモード
CLI(Command Line Interface)モードはコマンドラインからのPHP実行をサポートします。
# PHPモジュール一覧表示
php -m
# スクリプト実行
php script.php
# 対話モード
php -a
特徴:
- Webサーバー依存なし
- バッチ処理に最適
- デバッグやメンテナンスに利用
- メモリ制限が緩和
4.2. CGIモード
CGIモードは伝統的なWeb実行方式です。各リクエストで独立プロセスを生成します。
Apacheでの設定例:
# httpd.conf
ScriptAlias /php-cgi/ "/usr/bin/"
AddHandler php-cgi .php
Action php-cgi /php-cgi/php-cgi
4.3. FastCGIモード
FastCGIモードは現代の主流実行方式です。永続プロセスにより高いパフォーマンスを実現します。
Nginxとの連携:
# /etc/nginx/sites-available/default
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
4.4. ISAPIモード
ISAPI(Internet Server Application Program Interface)はWindows環境でのMicrosoft固有のAPIです。IISサーバーと密に統合されます。
特徴:
- Windows環境専用
- インプロセス実行で高速
- メモリ共有で効率的
- IISと密な連携
4.5. Apacheモジュールモード
mod_phpモジュール
mod_phpはApacheにPHPを組み込むモジュールです。インプロセスでPHPを実行します。
# LoadModule configuration
LoadModule php7_module modules/libphp7.so
AddHandler php7-script .php
AddType text/html .php
実行フロー:
Client Request -> Apache -> mod_php -> SAPI -> PHP Engine -> Response
利点と欠点:
- 利点:高速な実行速度、簡単な設定
- 欠点:メモリ使用量の増加、Apache依存、安定性リスク
mod_cgi/mod_fcgidモジュール
mod_fcgidはApacheのFastCGI実装です。外部プロセスとしてPHPを実行します。
# mod_fcgid configuration
LoadModule fcgid_module modules/mod_fcgid.so
FcgidWrapper /usr/bin/php-cgi .php
4.6. 各モードの比較
| モード | パフォーマンス | メモリ使用 | 安定性 | スケーラビリティ |
|---|---|---|---|---|
| CLI | N/A | 低い | 高い | N/A |
| CGI | 低い | 低い | 中程度 | 低い |
| FastCGI | 高い | 高い | 高い | 高い |
| ISAPI | 高い | 中程度 | 中程度 | 中程度 |
| mod_php | 非常に高い | 非常に高い | 低い | 低い |
現代のWebアプリケーションでは、パフォーマンスと安定性のバランスに優れたFastCGIモード(PHP-FPM + Nginx/Apache)が主流となっています。特に、負荷分散や水平スケーリングを必要とするシステムではFastCGIのアーキテクチャが最適です。