:>/dev/null

ラガードエンジニアの不撓不屈の精神

PHP-FPMに環境変数を渡す

centos+nginx+php-fpmで構築したサーバで外部プロキシ経由のインターネット接続設定時でのメモ。
apache+phpで構築したサーバでは「/etc/environment」を起動時に読み込み可能な為、環境変数設定が可能だが上記環境では正常に読み込まれない。
調査・対応を下記へ記載しておく。

  • 以下構築要件
    • apache+php ← 「/etc/environment」読み込まれる (env設定可能)
    • centos+nginx+php-fpm ←「/etc/environment」読み込まれない(env設定不可)
■ 改修前
$ 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)

PHP-FPMに環境変数を渡す - Qiita