php - Chrooted PHP-FPM脚本过一会儿无法解析DNS

标签 php dns chroot

我需要一些帮助,以了解为什么在PHP-FPM服务启动后的几分钟内,PHP-FPM chroot的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
  • /var/run/mysqld的mount --bind,用于MySQL的套接字。
  • 用于nscd解析程序的套接字的/var/run/nscd的mount --bind
  • 一个存储PHP session 的地方

  • 当WordPress提示无法通过以下方式下载更新时,我注意到了该问题:

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

    示例脚本:
    <?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()checkdnsrr() 始终都可以正常工作。

    三个问题:
  • dns_get_record()失败时,是什么使checkdnsrr()gethostbynamel()实现解析FQDN的?
  • 在chroot设置中,gethostbynamel()需要什么?
  • 什么使它只能工作片刻?

  • 软件版本:
  • Debian 9
  • Nginx 10.3
  • PHP 7.0.19

  • 谢谢

    最佳答案

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

  • /lib/x86_64-linux-gnu/libnss_dns.so.2(或取决于OS变体/lib/libnss_dns.so )
  • /etc/nsswitch.conf
  • /etc/resolv.conf
  • 关于php - Chrooted PHP-FPM脚本过一会儿无法解析DNS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915774/

    相关文章:

    java - 如何为没有域名的主机创建SSL证书?

    ubuntu - 如何安装 chroot 依赖项?

    php - 创建基本的用户登录名。 $ _SESSION抛出错误

    javascript - 防止 javascript 函数自调用

    security - 如何让其他用户在 Google Cloud Storage 中创建域名存储桶?

    bash - 执行 chroot 并在 chroot 中执行命令的 Shell 脚本

    linux - 提取 Docker.io 镜像的根文件系统并在 chroot 中使用它是否安全?

    php - 从父类访问子变量?

    php - 在搜索数据库中插入分页。 PHP MySQL

    dns - 根据dns将请求转发到特定端口