PHP-FastCGI のテストとサイト別 php.ini 設定

4 テスト
まずは小さな PHP テストファイルを作成して、各サイトで PHP-FastCGI が正しく動作しているか確認します。以下は例として www.example1.com のドキュメントルートに置く手順です。
vi /var/www/web1/web/info.php
ファイルの中身は次のとおりです。
ブラウザで http://www.example1.com/info.php にアクセスしてください。出力が正しく表示され、Server API 行に CGI/FastCGI が表示されていれば成功です。
重要: 公開環境で phpinfo() を残しておくと情報漏えいのリスクがあります。確認後は必ず削除してください。
5 サイトごとのカスタム php.ini
各サイトは独自の php-fcgi-starter ラッパースクリプトを持つため、サイト別に異なる php.ini を使えます。ここでは /etc/php5/cgi/php.ini をコピーして www.example2.com に適用する例を示します。
まずは php.ini をコピーして所有権を変更します。
cp /etc/php5/cgi/php.ini /var/www/web2/
chown web2:web2 /var/www/web2/php.ini
(必要に応じて /var/www/web2/php.ini を編集してください。)
次に、web2 用の php-fcgi スターターを編集します。
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter
PHPRC に /var/www/web2/ を設定します。
#!/bin/sh
PHPRC=/var/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
編集後、Apache をリロードします。
/etc/init.d/apache2 reload
www.example2.com のドキュメントルートに別の info.php を作成して確認します。
vi /var/www/web2/web/info.php
内容は同様に phpinfo() を出力するだけです。
ブラウザで http://www.example2.com/info.php にアクセスし、Loaded Configuration File 行が /var/www/web2/php.ini を指していればサイト固有の php.ini が適用されています。
6 単一の PHP 設定を変更する方法
サイト全体で別の php.ini を渡す代わりに、php-fcgi-starter スクリプト内で PHP 実行時に -d オプションを使って個別に設定を上書きできます。たとえば、www.example2.com で magic_quotes_gpc を無効にしたい場合は次のようにします。
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php -d magic_quotes_gpc=off
変更後に Apache をリロードします。
/etc/init.d/apache2 reload
再度 http://www.example2.com/info.php を表示して magic_quotes_gpc 行を確認すると Off が反映されています。
7 参考リンク
- mod_fcgid: http://httpd.apache.org/mod_fcgid/
- Apache: http://httpd.apache.org/
- PHP: http://www.php.net/
- Debian: http://www.debian.org/
追加の実務ノウハウとチェックリスト
重要: 下記は運用でよく使う実践的なヒントです。
ミニ手順(すばやく確認するためのチェックリスト)
- サイトのドキュメントルートに phpinfo() を置く
- ブラウザで Server API と Loaded Configuration File を確認
- 必要なら php-fcgi-starter の PHPRC を更新
- Apache をリロードして変更を適用
- 確認後は phpinfo() を削除
代替アプローチ
- php-fpm を使う: 大規模または高負荷の環境では php-fpm のプール管理が有利です。プロセス管理や socket/ポート設定が柔軟になります。
- mod_php を使う: 単一ユーザーの共有ホスティングで PHP を Apache モジュール化することで簡便になりますが、プロセス分離やメモリ使用の観点で制約があります。
いつこの方法が失敗するか(カウンター例)
- PHP 実行バイナリが想定と異なるパスにある場合は exec コマンドが失敗します。
- PHPRC に設定したディレクトリに読み取り権限がないと php.ini が読み込まれません。
- セキュリティポリシー(AppArmor/SELinux)が php 実行を制限しているケースでは、想定どおりに動作しないことがあります。
役割別チェックリスト
- サイト管理者: サイト固有の php.ini の必要項目を一覧化してコミットする。
- サーバ運用者: php-fcgi-starter の所有者とパーミッションを確認し、Apache リロード手順を標準化する。
- セキュリティ担当: phpinfo 出力の有効化を最小限にし、公開環境では削除を自動化する。
セキュリティ強化の基本
- phpinfo() を本番で公開しない。
- サイト別 php.ini のパーミッションは最小権限にする(所有者のみ書込可など)。
- 不要な PHP 機能(eval, exec, shell_exec など)は php.ini で無効化する。
用語 1 行定義
- PHPRC: PHP が使用する php.ini を探索するディレクトリを指定する環境変数。
- php-fcgi-starter: PHP CGI 実行をラップして環境変数や起動オプションを設定するスクリプト。
トラブルシューティングの短い手順
- Apache のエラーログを確認する(通常 /var/log/apache2/error.log)。
- php-fcgi-starter の shebang と実行ビットを確認する。
- PHPRC が正しいディレクトリを指しているか、php.ini のパーミッションを確認する。
- AppArmor や SELinux のログを確認し、必要ならポリシーを調整する。
要点まとめ
- サイトごとに独自の php.ini を利用できるため、柔軟に PHP 設定を制御できます。
- 単一設定は -d オプションで簡単に上書き可能です。
- phpinfo() で確認し、確認後は必ず削除してください。
著者について
Falko Timme は Timme Hosting のオーナー(超高速 nginx ホスティング)です。HowtoForge の主要メンテナー(2005 年以降)であり、ISPConfig のコア開発者の一人(2000 年以降)です。O’Reilly の “Linux System Administration” にも寄稿しています。