为什么 PHP-FPM 会丢失终端里可用的代理
顺着代理配置追进 PHP-FPM 工作进程,并区分它们的环境与 PHP 流上下文。
同一个 PHP 文件在终端里能用代理,由 PHP-FPM 提供服务时却直连。先比较运行它的进程。终端用 shell 环境启动 PHP;Web 服务器把请求交给 FPM 已经创建的工作进程。
查看工作进程的环境
FPM 池配置提供 clear_env 和显式的 env[NAME] 条目。启用环境清理后,在登录 shell 中导出的变量不会进入工作进程。池条目可以传递选定的变量:
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 收到相同的值却仍表现不同,接下来就比较客户端选项和绕过规则。反复修改 shell 配置文件无法解决工作进程 HTTP 客户端内部的差异。