テクノロジーガイド

サイト別にPHP-FastCGIをテストして設定する

2 min read サーバー管理 更新されました 01 Oct 2025
サイト別にPHP-FastCGIをテストして設定する
サイト別にPHP-FastCGIをテストして設定する

4 テスト

まず、www.example1.com サイト用に小さな PHP テストファイルを作成します。例えば次のように配置します:

vi /srv/www/web1/web/info.php

内容は次のとおりです:

ブラウザで http://www.example1.com/info.php を開いてください。問題がなければ出力に CGI/FastCGI が Server API 行に表示されます。

phpinfo 出力の Server API に CGI/FastCGI が表示されているスクリーンショット

重要: 公開サーバー上で phpinfo() を恒久的に公開するのは情報漏洩リスクになります。検証後は必ずファイルを削除してください。

5 サイトごとのカスタム php.ini

各ウェブサイトは独自の php-fcgi-starter ラッパースクリプトを持てるため、サイト毎に異なる php.ini を割り当てられます。例として /etc/php5/fastcgi/php.ini をコピーして www.example2.com 用に配置します:

cp /etc/php5/fastcgi/php.ini /srv/www/web2/
chown web2:web2 /srv/www/web2/php.ini

(/srv/www/web2/php.ini を任意に編集できます)

次に php-fcgi スタータを編集して PHPRC を指すようにします:

vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starter

内容は次のように PHPRC を /srv/www/web2/ に設定します:

#!/bin/sh
PHPRC=/srv/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

Apache を再起動します:

/etc/init.d/apache2 restart

www.example2.com 用に新しい phpinfo() ファイルを作成します:

vi /srv/www/web2/web/info.php

ブラウザで http://www.example2.com/info.php を確認すると、Loaded Configuration File 行が /srv/www/web2/php.ini を指しているはずです。

phpinfo 出力の Loaded Configuration File が /srv/www/web2/php.ini を示すスクリーンショット

6 単一の PHP 設定を変更する

サイト全体の php.ini を置き換える代わりに、php-fcgi-starter 内で PHP 実行時に -d スイッチを付けて単一設定を上書きできます。例えば www.example2.com で magic_quotes_gpc を無効にする場合:

vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starter

スクリプトを次のように編集します:

#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi -d magic_quotes_gpc=off

変更後に Apache を再起動します:

/etc/init.d/apache2 restart

ブラウザで info.php を再確認し、magic_quotes_gpc が Off になっているか確認してください。

phpinfo 出力の magic_quotes_gpc が Off を示すスクリーンショット

7 参考リンク


追加解説と実務向けガイド

ファクトボックス — 主要パラメータ

  • PHP_FCGI_MAX_REQUESTS: 1 プロセスあたりの最大リクエスト数(例: 5000)
  • PHP_FCGI_CHILDREN: 子プロセス数(例: 8)
  • PHPRC: PHP が読み込む php.ini のディレクトリを指定

ミニ手順(方法論): サイト別 php.ini を導入するまでの最短手順

  1. 元の php.ini をコピーしてサイトディレクトリへ配置
  2. 所有者と権限を適切に設定(例: chown web2:web2)
  3. php-fcgi-starter の PHPRC をサイトディレクトリへ変更
  4. Apache を再起動
  5. phpinfo() で Loaded Configuration File を確認
  6. 検証後、phpinfo ファイルは削除

役割別チェックリスト

  • 開発者:
    • php.ini の変更内容を把握し、互換性を確認する
    • phpinfo() で期待どおりの設定が反映されているか検証する
  • 運用担当:
    • サイト専用ファイルの権限と所有者を確認する
    • Apache と PHP-FastCGI のログを監視する
  • セキュリティ担当:
    • phpinfo() は公開環境に残さない
    • php.ini で危険な設定(display_errors など)を無効化

失敗例と対処(いつうまくいかないか)

  • PHPRC のパスが誤っている: phpinfo() の Loaded Configuration File が期待値と異なる。対処: スタータでの PHPRC 設定とパスの綴りを確認。
  • 権限不足で php.ini を読み込めない: Apache ユーザ/Web サイト用ユーザの所有権を確認。
  • php-fcgi-starter の実行権限がない: スクリプトに実行ビットがついているか確認(chmod +x)。

代替アプローチ

  • .user.ini(PHP-FPM ではなく CGI/FCGI 環境で使える場合あり)や htaccess による一部設定の変更(モジュールや SAPI により可否が異なる)
  • PHP-FPM を導入してプール毎に php.ini 相当の設定を行う(より柔軟でパフォーマンス制御しやすい)

セキュリティとプライバシーの注意点

  • phpinfo() は機密情報(パス、モジュール、パスワード設定の手がかり)を含むため、本番環境では使用後に必ず削除する。
  • サイト専用の php.ini を配置する場合、ファイルの権限は最小限にし、Web から直接アクセスできない場所に置くかディレクトリ一覧を無効化する。

1行用語集

  • PHPRC: PHP が起動時に参照する php.ini のディレクトリを指定する環境変数。
  • php-fcgi-starter: PHP-CGI を起動するためのラッパースクリプトで、環境変数や追加オプションを設定する場所。

短い判断フロー(Mermaid)

以下は簡易的な導入判断フローです:

graph TD
  A[サイト単位で設定を分ける必要があるか?] -->|Yes| B[php.ini をサイトにコピー]
  A -->|No| C[スタータで -d オプションで個別設定]
  B --> D[PHPRC をサイトに設定して再起動]
  C --> D
  D --> E[phpinfo'' で確認]

要点のまとめ

  • サイトごとに独自 php.ini を使うには PHPRC を設定し、php-fcgi-starter を編集する。変更後は Apache 再起動と phpinfo() による確認が重要です。
  • 小さな設定変更は exec の -d オプションで行えるため、全体を置き換える必要はありません。
  • phpinfo() は便利だが機密情報を含むため、検証後は削除してセキュリティを保つこと。

重要: 変更を本番サーバーで適用する前にステージング環境で十分に検証してください。

共有する: X/Twitter Facebook LinkedIn Telegram
著者
編集

類似の素材

Windowsでスマホ風の単語候補を使う方法
チュートリアル

Windowsでスマホ風の単語候補を使う方法

Twitterのリンクをあとで読む:デスクトップとスマホでの保存術
生産性

Twitterのリンクをあとで読む:デスクトップとスマホでの保存術

ノートPCでDogecoinをマイニングする方法
暗号通貨

ノートPCでDogecoinをマイニングする方法

トラックパッドと外付けマウスで感度を分ける方法
How-to

トラックパッドと外付けマウスで感度を分ける方法

RE4 Remake D3Dエラー25の修正ガイド
ゲーム修理

RE4 Remake D3Dエラー25の修正ガイド

Ansible Molecule と Docker でロールを自動テスト
DevOps

Ansible Molecule と Docker でロールを自動テスト