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

时间:2017-12-20 23:25:07

标签: php dns chroot

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

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

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

  • 基本的/etc/hosts文件
  • / etc / ssl / certs的mount --bind
  • /dev/urandom(通过mknod
  • / usr / share / zoneinfo
  • mount --bind
  • 用于MySQL的套接字的{var / run / mysqld mount --bind
  • 用于套接字到nscd解析程序的/ {/ 1 / / scr / {/ 1}}。
  • 存储PHP会话的地方

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

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

示例脚本:

mount --bind

什么时候有效:

<?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));
?>

几个瞬间之后:

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"
  }
}

请注意,在任何情况下,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" } } dns_get_record() 始终都可以正常工作。

三个问题:

  1. checkdnsrr()失败时,dns_get_record()checkdnsrr()实现了解决FQDN的原因是什么?
  2. chrooted设置中gethostbynamel()需要什么?
  3. 什么能让它只运作一会儿?
  4. 软件版本:

    • Debian 9
    • Nginx 10.3
    • PHP 7.0.19

    由于

1 个答案:

答案 0 :(得分:0)

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

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