我一直在尝试通过 php 池配置中的内置 chroot 方法对 php-fpm 池进行 chroot。这是为了在同一个 AWS EC2 实例上托管多个 wordpress 网站。目前它是一个基本的 LEMP 堆栈,使用 AWS RDS 实例作为 mysql 层,到目前为止只有一个池用于一个 nginx vhost。
除了 Wordpress 的 DB 连接尝试连接到外部 RDS 主机名之外,一切都运行良好。当我告诉 Wordpress 使用主机名时,我的 php 日志中出现 mysql host not found 错误。当我 ping RDS 实例以获取其 IP(ping 也可以在 chroot 内部进行),并告诉 Wordpress 改用 IP 时,一切都按预期连接(AWS 安全组设置正确)。
为了进行实验,我将mount --bind
所有系统目录都挂载在 fpm 池 chroot 到的目录 (/etc、/lib 等) 中,因此我知道所有的 libs 和 dns 解析器都可供 chroot 使用:
$ mount --bind /etc /path/to/chroot/etc
$ mount --bind /lib /path/to/chroot/lib
...
但是,在公共网络上浏览网站时,php mysql 客户端无法解析主机名,这是出了问题。我尝试运行未 chroot 的网站,与 RDS 主机名的连接工作正常。chroot 后,网站无法通过主机名访问 RDS。
我一直在研究 chroot 带来的 DNS 问题,但就是找不到与这种情况有关的任何具体问题。如果有任何见解,我将不胜感激。