運用しているサーバーで PHP に安全に環境変数(DB情報など)を渡す方法を整理する。
※ Apache + php-fpm 構成を前提
※ mod_php の場合は手順が異なる
1. まず PHP の実行方式を確認する(php-fpm / mod_php)
php-fpm と mod_php のどちらを使っているかで、PHPに環境変数を渡す方法が変わってくるので、現在のPHPの実行方式を確認する。
Apache のロード済みモジュールを確認
httpd -M
# または
apachectl -M
判定基準
php_moduleが ある → mod_phpphp_moduleが ない +proxy_fcgi_moduleが ある → php-fpm
今回の環境は php-fpm でした。
2. php-fpm が本当に動いているか確認
ps aux | grep php-fpm
または
systemctl status php-fpm
- php-fpm: master process
- php-fpm: pool www
が表示されれば php-fpm 稼働中。
3.php-fpm の設定ファイルの場所を確認
RHEL / CentOS / AlmaLinux 系の場合:
/etc/php-fpm.conf ← php-fpm 全体の設定
/etc/php-fpm.d/www.conf ← 「PHPを実際に動かすグループ(pool)」の設定
環境変数を設定するのは www.conf
4.Apache / OS の環境変数が PHP に渡っているか確認
Apache 設定に SetEnv があるか
sudo grep -R "SetEnv" /etc/httpd/conf /etc/httpd/conf.d
原則、php-fpm では Apache に SetEnv があっても PHP からは見えない
PHP から見えるか一時確認(※確認後削除)
<?php
var_dump(getenv('PATH'));
結果が bool(false) なら php-fpm により環境変数は遮断されている
5.clear_env の設定を確認
clear_env の設定を確認
今回の出力
;clear_env = no
コメントアウトされており未設定なので、Apache / OS 由来の環境変数は PHP に渡っていない。(デフォルト値、設定がない場合は yesなので)
この行は 変更しなくてよい
6.念のためwww.conf をバックアップ
sudo cp -a /etc/php-fpm.d/www.conf \
/etc/php-fpm.d/www.conf.bak.$(date +%F-%H%M%S)
7.php-fpm に環境変数を追加する
sudo vi /etc/php-fpm.d/www.conf
次のように env[…] を追加:
; --- Application environment variables ---
env[DB_HOST] = localhost
env[DB_DATABASE] = example_db
env[DB_USERNAME] = example_user
env[DB_PASSWORD] = secret_password
8.php-fpm を reload で反映
sudo systemctl reload php-fpm
restart ではなく reload にすることで、処理中のページを止めずに反映できる
9.PHP 側で使う
PHP 側で取得できるか確認
<?php
var_dump(getenv('DB_HOST'));
string("localhost") などが出れば成功。
PHP 側の書き方例
$db_host = getenv('DB_HOST');
$db_name = getenv('DB_DATABASE');
$db_user = getenv('DB_USERNAME');
$db_pass = getenv('DB_PASSWORD');
まとめ
php-fpm 環境では Apache の SetEnv は基本使えないので、環境変数は php-fpm の www.conf に env[…] で設定。
