Chrooted PHP-FPM скрипт не может разрешить DNS через мгновение

Мне нужна помощь, чтобы понять, почему PHP-скрипт PHP-FPM не может разрешить полное доменное имя через несколько мгновений после запуска службы PHP-FPM.

Когда я (пере) запускаю службу PHP-FPM, она работает (разрешение успешно) через несколько секунд, а затем происходит сбой разрешения.

Я хромировал PHP-приложение (на самом деле WordPress) через PHP-FPM (настройки « chroot` в файле конфигурации пула PHP-FPM) и дал PHP то, что ему нужно:

  • Основной /etc/hosts файл
  • mount --bind из / etc / ssl / certs
  • /dev/urandom (с помощью mknod)
  • mount --bind из / usr / share / zoneinfo
  • mount --bind / var / run / mysqld для сокета к MySQL.
  • mount --bind / var / run / nscd для преобразователя сокетов в nscd.
  • Место для хранения сессий PHP

Я заметил проблему, когда WordPress пожаловался, что не может загружать обновления с:

stream_socket_client (): php_network_getaddresses: getaddrinfo не удалось: имя или служба неизвестна stream_socket_client (): невозможно подключиться к tcp: //www.wordpress.org: 80 (php_network_getaddresses: getaddrinfo не удалось: имя или служба неизвестна)

Пример скрипта:

<?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. Что делает dns_get_record() а также checkdnsrr() добиться разрешения полного доменного имени при gethostbynamel() потерпит неудачу?
  2. Что значит gethostbynamel() нужно в настройке chroot?
  3. Что может заставить его работать только на несколько мгновений?

Версии программного обеспечения:

  • Debian 9
  • Nginx 10,3
  • PHP 7.0.19

Спасибо

10

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …