我需要一些帮助,以了解为什么PHPM CHROOTED PHP脚本在PHP-FPM服务启动后几乎无法解决FQDN。
当我(re)启动php-fpm服务时,它起作用(分辨率成功)几秒钟,然后分辨率失败。
i通过php-fpm(在php-fpm池配置文件中设置````````chroot)chroot chroot chroot chroot of php fpm(wordpress),并给了php:
>- 基本
/etc/hosts
文件 - /etc/ssl/certs的
mount --bind
- a
/dev/urandom
(通过mknod
) - /usr/share/Zoneinfo的
mount --bind
- /var/run/mysqld的
mount --bind
for socket to mysql。 -
mount --bind
of/var/run/nscd for套接字到NSCD解析器。 - 存储PHP会话的地方
我注意到WordPress抱怨无法下载更新时的问题:
stream_socket_client():php_network_getaddresses:getAddrinfo失败:名称或服务未知stream_socket_client():无法连接到tcp://www.wordpress.org:80)
示例脚本:
<?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? -
gethostbynamel()
在chrooted设置中需要什么? - 是什么才能使它仅在几分钟内起作用?
软件版本:
- Debian 9
- nginx 10.3
- PHP 7.0.19
谢谢
根据问题的评论,恰恰是php-fpm脚本无法解决DNS,OP能够通过将以下文件添加到监狱中来解决问题:
-
/lib/x86_64-linux-gnu/libnss_dns.so.2
(或取决于OS变体,/lib/libnss_dns.so
) -
/etc/nsswitch.conf
-
/etc/resolv.conf