PHP ランタイムアーキテクチャ
リクエスト処理フローと設定ポイント
アーキテクチャ概要
クライアント
ブラウザ / API Client
→ HTTP/HTTPS →
Webサーバー
Apache / Nginx
→ FastCGI Protocol →
FastCGI
mod_fcgid / PHP-FPM
→
PHP
インタープリター
→
Application
Laravel / WordPress
データフローと制限ポイント
重要: 各層に制限があり、上流で弾かれると下流には到達しない。 例: mod_fcgidで128KBを超えると、PHPの設定は意味がない。
1
クライアント → Webサーバー
ネットワークタイムアウト、TLS handshake
2
Webサーバー
Apache: LimitRequestBody, Timeout
Nginx: client_max_body_size, proxy_read_timeout
Nginx: client_max_body_size, proxy_read_timeout
3
FastCGI (mod_fcgid)
FcgidMaxRequestLen (デフォルト: 128KB!) ← よくある問題箇所
FcgidIOTimeout, FcgidBusyTimeout
FcgidIOTimeout, FcgidBusyTimeout
4
PHP
upload_max_filesize, post_max_size
max_execution_time, memory_limit
max_execution_time, memory_limit
5
アプリケーション
ディスク容量、フレームワーク設定
mod_fcgid vs PHP-FPM
| 項目 | mod_fcgid | PHP-FPM |
|---|---|---|
| 統合方式 | Apache組み込みモジュール | 独立プロセス |
| 設定場所 | httpd.conf | php-fpm.conf + php.ini |
| パフォーマンス | 中 | 高 |
| リクエスト制限 | FcgidMaxRequestLen (128KB!) | 制限なし(PHPに委譲) |
| 推奨用途 | 小〜中規模、レガシー | 中〜大規模、本番環境 |
推奨: 新規構築ではPHP-FPMを使用。mod_fcgidはレガシー環境向け。
設定の優先順位と依存関係
FcgidMaxRequestLen >= post_max_size >= upload_max_filesize
FcgidMaxRequestLen:
5.5GB (5905580032 bytes)
← 最大
↓
post_max_size:
5.5GB (5632M)
↓
upload_max_filesize:
5.5GB (5632M)
← 最小
各層の設定詳細
Apache + mod_fcgid
1 # /etc/httpd/conf.d/fcgid.conf 2 <IfModule mod_fcgid.c> 3 # リクエストサイズ制限 (5.5GB) 4 FcgidMaxRequestLen 5905580032 5 6 # タイムアウト設定 7 FcgidConnectTimeout 20 # 接続タイムアウト 8 FcgidIOTimeout 600 # I/Oタイムアウト (10分) 9 FcgidBusyTimeout 600 # 処理タイムアウト (10分) 10 11 <IfModule mod_mime.c> 12 AddHandler fcgid-script .fcgi 13 </IfModule> 14 </IfModule>
Nginx + PHP-FPM
1 # /etc/nginx/nginx.conf 2 http { 3 client_max_body_size 5632M; # リクエストボディ制限 4 client_body_timeout 600s; # ボディ受信タイムアウト 5 6 server { 7 location ~ \.php$ { 8 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; 9 fastcgi_read_timeout 600s; # FPMからの応答待ち 10 fastcgi_send_timeout 600s; # FPMへの送信タイムアウト 11 12 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 13 include fastcgi_params; 14 } 15 } 16 }
PHP-FPM
1 ; /etc/php-fpm.d/www.conf 2 [www] 3 user = www-data 4 group = www-data 5 6 ; プロセス管理 7 pm = dynamic 8 pm.max_children = 50 ; 最大ワーカー数 9 pm.start_servers = 5 10 pm.min_spare_servers = 5 11 pm.max_spare_servers = 35 12 13 ; タイムアウト 14 request_terminate_timeout = 600 ; リクエスト処理の最大時間 15 16 ; スローログ 17 slowlog = /var/log/php-fpm/www-slow.log 18 request_slowlog_timeout = 5s
PHP (php.ini)
1 ; /etc/php.ini 2 ; ファイルアップロード 3 upload_max_filesize = 5632M ; 1ファイルの最大サイズ 4 post_max_size = 5632M ; POSTデータ全体の最大サイズ 5 max_file_uploads = 20 ; 同時アップロードファイル数 6 7 ; 実行時間 8 max_execution_time = 3600 ; スクリプト実行時間 (秒) 9 max_input_time = 3600 ; 入力データ解析時間 (秒) 10 11 ; メモリ (ファイルアップロードには影響小) 12 memory_limit = 256M
よくあるエラーと対処
413 Request Entity Too Large
原因: リクエストサイズ制限を超過
確認箇所:
- Nginx: client_max_body_size
- Apache: LimitRequestBody
- mod_fcgid: FcgidMaxRequestLen
- PHP: post_max_size, upload_max_filesize
504 Gateway Timeout
原因: 処理時間超過
確認箇所:
- Nginx: proxy_read_timeout, fastcgi_read_timeout
- mod_fcgid: FcgidIOTimeout, FcgidBusyTimeout
- PHP-FPM: request_terminate_timeout
- PHP: max_execution_time
500 Internal Server Error (メモリ不足)
原因: PHPメモリ制限超過
確認箇所:
- PHP: memory_limit
- エラーログ: "Allowed memory size exhausted"
監視項目
PHP-FPM
- • active processes (アクティブプロセス数)
- • listen queue (待ちキュー長)
- • max children reached (最大到達回数)
- • slow requests (スローログ数)
Webサーバー
- • 4xx/5xx エラー率
- • リクエスト処理時間
- • アクティブ接続数
- • upstream response time
トラブルシューティングフロー
1
エラーログを確認
tail -f /var/log/nginx/error.log /var/log/php-fpm/error.log2
どの層でエラーが発生しているか特定
Nginx? mod_fcgid? PHP-FPM? PHP?
3
その層の設定を確認・修正
タイムアウト、サイズ制限、プロセス数
4
設定の依存関係を確認
上流の制限が下流より大きいか?
5
サービス再起動・テスト
systemctl reload nginx php-fpm