我需要一些帮助来理解为什么在PHP-FPM服务启动后PHP-FPM chrooted PHP脚本无法解决FQDN的几个瞬间.
当我(重新)启动PHP-FPM服务时,它工作(分辨率成功)几秒钟,然后解决方案失败.
我通过PHP-FPM(在PHP-FPM池配置文件中设置``chroot`)chroot一个PHP应用程序(实际上是一个WordPress),并给了它所需要的PHP:
/etc/hosts文件mount --bind的的/ etc/SSL /证书/dev/urandom(通过mknod)mount --bind将/ usr/share/zoneinfo中mount --bind的/ var/run中/ mysqld的套接字到MySQL.mount --bind/ var/run/nscd用于套接字到nscd解析器.当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() 始终正常工作.
三个问题:
dns_get_record()和checkdnsrr()实现方法是什么gethostbynamel()?gethostbynamel()在chrooted设置中需要什么?软件版本:
谢谢
根据对该问题的评论,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