同じ PHP ファイルでも、ターミナルではプロキシを使い、PHP-FPM 経由で配信されると直接接続することがあります。まず実行しているプロセスを比較してください。ターミナルはシェルの環境変数で PHP を起動しますが、Web サーバーは FPM がすでに作成したワーカーへリクエストを送ります。

ワーカーの環境を確認する

FPM プール設定は clear_env と明示的な env[NAME] エントリを提供します。環境変数のクリアが有効な場合、ログインシェルで変数を export してもワーカーには渡りません。プールのエントリで選択した変数を渡せます:

env[http_proxy] = http://203.0.113.10:8080
env[https_proxy] = http://203.0.113.10:8080

設定変更はデプロイで通常使う FPM のリロード手順で適用してください。値は実際にアプリケーションを処理するプールに置きます。別のプール、サービスアカウント、コンテナがあるために、正しく見える編集が効果を持たないこともあります。

実行中のリクエストをデバッグするときは、期待する設定が存在するかだけを確認します。完全な環境変数の値を表示する公開診断ページは、無関係な秘密情報とともにプロキシの認証情報を露出させることがあります。

次に PHP のトランスポートを確認する

libcurl には文書化されたプロキシ環境変数の扱いがあり、明示的な PHP cURL ハンドルにも独自のオプションがあります。PHP の HTTP ストリームラッパーには別個のコンテキスト設定があります。ワーカーに変数を渡しても、PHP のすべてのネットワーク API がそれを使うわけではありません。

これで有用な二段階の確認になります。ワーカーが何を受け取ったかを確認し、次に選んだ HTTP クライアントがプロキシ設定をどう読むかを確認します。CLI と FPM が同じ値を受け取っても挙動が異なる場合は、次にクライアントのオプションとバイパス規則を比較してください。シェルのプロファイルを何度編集しても、ワーカーの HTTP クライアント内の差異は解消できません。

関連記事