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
3
FastCGI (mod_fcgid)
FcgidMaxRequestLen (デフォルト: 128KB!) ← よくある問題箇所
FcgidIOTimeout, FcgidBusyTimeout
4
PHP
upload_max_filesize, post_max_size
max_execution_time, memory_limit
5
アプリケーション
ディスク容量、フレームワーク設定

mod_fcgid vs PHP-FPM

項目mod_fcgidPHP-FPM
統合方式Apache組み込みモジュール独立プロセス
設定場所httpd.confphp-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
2http {
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]
3user = www-data
4group = www-data
5
6; プロセス管理
7pm = dynamic
8pm.max_children = 50 ; 最大ワーカー数
9pm.start_servers = 5
10pm.min_spare_servers = 5
11pm.max_spare_servers = 35
12
13; タイムアウト
14request_terminate_timeout = 600 ; リクエスト処理の最大時間
15
16; スローログ
17slowlog = /var/log/php-fpm/www-slow.log
18request_slowlog_timeout = 5s

PHP (php.ini)

1; /etc/php.ini
2; ファイルアップロード
3upload_max_filesize = 5632M ; 1ファイルの最大サイズ
4post_max_size = 5632M ; POSTデータ全体の最大サイズ
5max_file_uploads = 20 ; 同時アップロードファイル数
6
7; 実行時間
8max_execution_time = 3600 ; スクリプト実行時間 (秒)
9max_input_time = 3600 ; 入力データ解析時間 (秒)
10
11; メモリ (ファイルアップロードには影響小)
12memory_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.log
2
どの層でエラーが発生しているか特定
Nginx? mod_fcgid? PHP-FPM? PHP?
3
その層の設定を確認・修正
タイムアウト、サイズ制限、プロセス数
4
設定の依存関係を確認
上流の制限が下流より大きいか?
5
サービス再起動・テスト
systemctl reload nginx php-fpm