我需要一些帮助来理解为什么在PHP-FPM服务启动后PHP-FPM chrooted PHP脚本无法解决FQDN的几个瞬间。
当我(重新)启动PHP-FPM服务时,它会工作(分辨率成功)几秒钟,然后分辨率失败。
我通过PHP-FPM(在PHP-FPM池配置文件中设置``chroot`)chroot一个PHP应用程序(实际上是一个WordPress),并给了它所需的PHP:
/etc/hosts
文件mount --bind
/dev/urandom
(通过mknod
)mount --bind
mount --bind
。当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()
始终都可以正常工作。
三个问题:
checkdnsrr()
失败时,dns_get_record()
和checkdnsrr()
实现了解决FQDN的原因是什么?gethostbynamel()
需要什么?软件版本:
由于
答案 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