Chroot 的 PHP-FPM 脚本在片刻之后无法解析 DNS

2022-08-30 21:21:15

我需要一些帮助来理解为什么 PHP-FPM chroot PHP 脚本在 PHP-FPM 服务启动后几分钟无法解析 FQDN。

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

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

  • 基本文件/etc/hosts
  • A 的 /etc/ssl/certsmount --bind
  • A(通过/dev/urandommknod)
  • A 的 /usr/share/zoneinfomount --bind
  • 一个 /var/run/mysqld 用于 MySQL 的套接字。mount --bind
  • 一个 /var/run/nscd 用于套接字到 nscd 解析器。mount --bind
  • 存储 PHP 会话的位置

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

stream_socket_client(): php_network_getaddresses: getaddrinfo failed: name or service not known stream_socket_client(): 無法連接到 tcp://www.wordpress.org:80 (php_network_getaddresses: getaddrinfo failed: name or service not known)

示例脚本:

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

三个问题:

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

软件版本:

  • Debian 9
  • 恩金克斯 10.3
  • 7.0.19 菲律宾比索

谢谢


答案 1

根据对该问题的评论,Chrooted PHP-FPM脚本在片刻之后无法解析DNS,OP能够通过将以下文件添加到 jail来解决此问题:

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

答案 2

推荐