片刻后,Chrooted PHP-FPM脚本无法解析DNS

CDu*_*Duv 11 php dns chroot

我需要一些帮助来理解为什么在PHP-FPM服务启动后PHP-FPM chrooted PHP脚本无法解决FQDN的几个瞬间.

当我(重新)启动PHP-FPM服务时,它工作(分辨率成功)几秒钟,然后解决方案失败.

我通过PHP-FPM(在PHP-FPM池配置文件中设置``chroot`)chroot一个PHP应用程序(实际上是一个WordPress),并给了它所需要的PHP:

  • 一个基本/etc/hosts文件
  • mount --bind的的/ etc/SSL /证书
  • A /dev/urandom(通过mknod)
  • 一个mount --bind将/ usr/share/zoneinfo中
  • 一个mount --bind的/ var/run中/ mysqld的套接字到MySQL.
  • 一个mount --bind/ var/run/nscd用于套接字到nscd解析器.
  • 存储PHP会话的地方

当WordPress抱怨它无法下载更新时,我注意到了这个问题:

stream_socket_client():php_network_getaddresses:getaddrinfo failed:名称或服务未知stream_socket_client():无法连接到tcp://www.wordpress.org:80(php_network_getaddresses:getaddrinfo failed:名称或服务未知)

示例脚本:

<?php
$domain = 'www.example.com';
echo 'gethostbynamel(): '; var_dump(gethostbynamel($domain));
echo 'checkdnsrr(): ';     var_dump(checkdnsrr($domain, 'A'));
echo 'dns_get_record(): '; var_dump(dns_get_record($domain));
?>
Run Code Online (Sandbox Code Playgroud)

当它工作时:

gethostbynamel(): array(1) {
  [0]=>
  string(13) "93.184.216.34"
}
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
  [0]=>
  array(5) {
    ["host"]=>
    string(15) "www.example.com"
    ["class"]=>
    string(2) "IN"
    ["ttl"]=>
    int(86348)
    ["type"]=>
    string(1) "A"
    ["ip"]=>
    string(13) "93.184.216.34"
  }
}
Run Code Online (Sandbox Code Playgroud)

几个瞬间之后:

gethostbynamel(): bool(false)
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
  [0]=>
  array(5) {
    ["host"]=>
    string(15) "www.example.com"
    ["class"]=>
    string(2) "IN"
    ["ttl"]=>
    int(86400)
    ["type"]=>
    string(1) "A"
    ["ip"]=>
    string(13) "93.184.216.34"
  }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是,在任何情况下,都dns_get_record()checkdnsrr() 始终正常工作.

三个问题:

  1. 失败时解决FQDN的原因dns_get_record()checkdnsrr()实现方法是什么gethostbynamel()
  2. gethostbynamel()在chrooted设置中需要什么?
  3. 什么能让它只运作一会儿?

软件版本:

  • Debian 9
  • Nginx 10.3
  • PHP 7.0.19

谢谢

Mik*_*osh 3

根据对该问题的评论,Chrooted PHP-FPM script won't resolving DNS after a moment,OP能够通过将以下文件添加到监狱来解决该问题:

  • /lib/x86_64-linux-gnu/libnss_dns.so.2(或取决于操作系统变体,/lib/libnss_dns.so
  • /etc/nsswitch.conf
  • /etc/resolv.conf