如何在 PHP-FPM 中配置 env 环境变量传递敏感信息?

文章导读
在 PHP-FPM 中传递敏感信息最推荐的方式是在进程池配置文件中使用 env[VAR_NAME] 指令,适用于数据库密码、API 密钥等不需要频繁变动的凭证。风险边界在于配置文件本身必须限制读取权限,避免被其他系统用户窃取。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 PHP-FPM 中传递敏感信息最推荐的方式是在进程池配置文件中使用 env[VAR_NAME] 指令,适用于数据库密码、API 密钥等不需要频繁变动的凭证。风险边界在于配置文件本身必须限制读取权限,避免被其他系统用户窃取。

先说结论:通过修改 PHP-FPM 进程池配置文件设置环境变量是生产环境常用方案,但需配合文件权限控制。

  • 适合:固定密钥、数据库连接信息、第三方服务 Token
  • 优先做:限制配置文件仅 root 或 php-fpm 用户可读
  • 再验证:使用 phpinfo() 确认变量存在且未意外暴露

命令速用版

直接编辑 PHP-FPM 进程池配置文件,通常在 /etc/php-fpm.d/ 或 /etc/php/ 目录下,添加 env 配置后重启服务。

sudo vim /etc/php-fpm.d/www.conf
env[DB_PASSWORD] = "secure_password_123"
env[API_KEY] = "sk_live_abcdef"
sudo systemctl restart php-fpm

为什么会这样

PHP-FPM 进程独立于 Web 服务器运行,默认不会继承 Nginx 或 Apache 的环境变量。

PHP-FPM 是一个独立的进程管理器,它启动的 worker 进程拥有独立的环境空间。Web 服务器(如 Nginx)通过 FastCGI 协议与 PHP-FPM 通信,默认只传递请求相关参数,不会自动传递系统环境变量。为了安全隔离,PHP-FPM 默认配置通常会清空继承的环境变量,必须显式声明才能传递。

分步处理

按照查找配置、添加变量、设置权限、重启服务的顺序操作。

1. 找到进程池配置文件,常见路径为 /etc/php-fpm.d/www.conf 或 /etc/php/8.1/fpm/pool.d/www.conf。

2. 在配置文件中添加 env 指令,格式为 env[变量名] = 值,每行一个变量。

3. 检查配置文件权限,执行 ls -l 确认文件所有者为 root,权限为 640 或 600,防止其他用户读取。

4. 重启 PHP-FPM 服务使配置生效,执行 sudo systemctl restart php-fpm 或 sudo service php-fpm restart。

怎么验证是否生效

通过 PHP 脚本打印 getenv() 结果或查看 phpinfo() 输出确认变量是否存在。

如何在 PHP-FPM 中配置 env 环境变量传递敏感信息?

创建一个测试脚本 info.php,内容为 <?php phpinfo(); ?>,在浏览器访问该页面,搜索环境变量部分查看是否包含配置的键名。或者使用代码 <?php echo getenv('DB_PASSWORD'); ?> 确认能读取到值。验证完成后务必删除测试文件,防止敏感信息泄露。

常见坑

配置文件权限过松、clear_env 设置冲突、phpinfo 页面未删除是主要风险点。

1. 配置文件权限:如果 www.conf 对其他用户可读,敏感信息会直接泄露给系统上的其他账户。

2. clear_env 选项:部分版本默认 clear_env = yes,这会清空现有环境,确保 env 指令能正常工作,但需注意不要依赖系统原有环境变量。

3. 信息泄露:phpinfo() 会显示所有环境变量,生产环境严禁保留测试用的 info.php 文件。

常见问题

env 配置和 putenv() 函数有什么区别?

env 配置在进程启动时生效,putenv() 仅在当前请求脚本运行时生效。

Nginx 的 fastcgi_param 能代替 PHP-FPM 的 env 吗?

不能直接代替,fastcgi_param 传递的是请求参数,env 配置的是进程级环境变量,后者更安全且持久。

修改配置后需要重载还是重启?

建议重启,部分环境变量配置需要重启 PHP-FPM 主进程才能完全生效。

参考来源

PHP.net - PHP-FPM 配置说明:https://www.php.net/manual/en/install.fpm.configuration.php

PHP.net - FPM 进程池配置选项:https://www.php.net/manual/en/install.fpm.configuration.php#pool-options