Chroot 的 PHP-FPM 脚本在片刻之后无法解析 DNS
我需要一些帮助来理解为什么 PHP-FPM chroot PHP 脚本在 PHP-FPM 服务启动后几分钟无法解析 FQDN。
当我(重新)启动PHP-FPM服务时,它会工作几秒钟(解析成功),然后解析失败。
我通过PHP-FPM(PHP-FPM池配置文件中的设置''chroot')chroot了一个PHP应用程序(实际上是WordPress),并给了PHP它需要的东西:
- 基本文件
/etc/hosts
- A 的 /etc/ssl/certs
mount --bind
- A(通过
/dev/urandom
mknod
) - A 的 /usr/share/zoneinfo
mount --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()
三个问题:
- 在失败时解决 FQDN 的原因是什么?
dns_get_record()
checkdnsrr()
gethostbynamel()
- 在 chrooted 设置中需要什么?
gethostbynamel()
- 什么能使它只工作一会儿?
软件版本:
- Debian 9
- 恩金克斯 10.3
- 7.0.19 菲律宾比索
谢谢