PHP-FPMに環境変数を渡す
centos+nginx+php-fpmで構築したサーバで外部プロキシ経由のインターネット接続設定時でのメモ。
apache+phpで構築したサーバでは「/etc/environment」を起動時に読み込み可能な為、環境変数設定が可能だが上記環境では正常に読み込まれない。
調査・対応を下記へ記載しておく。
- 以下構築要件
■ 改修前 $ vim www_root/index.php $context = stream_context_create(['http' => ['timeout' => 3]]); $content = file_get_contents('http://[DST_SRV]', false, $context); ↓ ■ 改修後 nginx?php-fpm?側で/etc/environmentの設定が読み込まれない為、下記設定したが環境変数が反映されない。。 ※nginx、php-fpmの各ホームディレクトリで~/.bash_profileを設置したが、こちらも反映されず。。 $ /etc/php-fpm.d/www.conf clear_env = noの行のコメントアウトをはずして再読み込みすると解消する。 @@ -367,7 +367,7 @@ ; Setting to "no" will make all environment variables available to PHP code ; via getenv(), $_ENV and $_SERVER. ; Default Value: yes -;clear_env = no +clear_env = no 上記設定で環境変数が反映されない為、confへ直接記載する。 $vim /etc/php-fpm.d/www.conf env[HTTP_PROXY] = gwproxy.mysrv.com:3128 $ vim www_root/index.php $proxy_context = array( "http" => array( "proxy" => "tcp://".$_SERVER['HTTP_PROXY'], 'request_fulluri' => true, 'timeout' => 3, ), ); $context = stream_context_create($proxy_context); $content = file_get_contents('http://[DST_SRV]', false, $context);
上記設定で外部プロキシ経由したインターネット接続が可能になります。
apache+php環境同様にアプリ側でproxyを意識せず、透過的に設定可能なら良いのですが。
⇒curl_init関数使用した環境では、「/etc/environment」環境辺変数指定でproxy経由接続可能。file_get_contents関数を使用した場合で発生する事象と判明。関数仕様に依存した現象。
clear_env = noの行のコメントアウトをはずして再読み込みすると解消する。
$vim /etc/php-fpm.d/www.conf clear_env = no
red)