Jailed PHP-FPM TLS/DNS配置:子目录脚本curl加载CA证书报错
故障原因
当前curl.cainfo配置使用的是相对路径etc/ssl/cert.pem,PHP解析相对路径时以脚本运行时的工作目录为基准:
- 根目录下脚本运行时工作目录为
/var/www/html,可匹配到同层级的etc/ssl/cert.pem,因此运行正常 - 子目录下脚本运行时工作目录为对应子目录路径(如
/var/www/html/folder),子目录内无etc/ssl/cert.pem文件,因此抛出加载失败警告
修复方案(PHP-FPM进程池配置调整,二选一即可)
方案1:配置为绝对路径(优先推荐,稳定性最高)
绝对路径不会随脚本所在目录、工作目录切换发生变化,是最稳妥的方案,根据你的隔离模式选对应的配置值:
- 如果PHP-FPM已开启
chroot = /var/www/html做jail隔离,将原有配置修改为:
php_admin_value[curl.cainfo] = /etc/ssl/cert.pem
chroot模式下进程视角的根目录/直接对应宿主机的/var/www/html,该路径会稳定指向jail内的证书文件。
- 如果未通过FPM chroot做隔离,只是将依赖资源放在站点根目录,将原有配置修改为宿主机绝对路径:
php_admin_value[curl.cainfo] = /var/www/html/etc/ssl/cert.pem
修改完成后重启PHP-FPM服务即可生效,所有目录下的脚本都能正常读取CA证书。
方案2:锁定FPM进程初始工作目录
如果因业务限制不能使用绝对路径,可在对应FPM进程池配置中添加工作目录锁定参数,强制所有PHP进程启动后默认工作在jail根目录:
- 开启chroot的场景添加:
chdir = /
- 未开启chroot的场景添加:
chdir = /var/www/html
配置后相对路径etc/ssl/cert.pem会永远以jail根目录为基准解析,子目录脚本也能找到证书。注意该方案存在兼容风险:如果业务代码中有调用chdir()切换工作目录的逻辑,相对路径解析基准还是会变化,导致证书加载失败。
校验方式
配置生效后,分别在站点根目录、子目录下创建测试脚本,发起HTTPS的curl请求,确认不再抛出cafile stream加载失败的警告即可。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

