php-fpm 環境で PHP に環境変数を設定する手順まとめ(Apache)

運用しているサーバーで 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_php
  • php_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[…] で設定。

タイトルとURLをコピーしました