Chrooted PHP-FPM script cannot resolve DNS after a moment

admin

Administrator
Staff member
I need some help to understand why a PHP-FPM chrooted PHP script fails to resolve an FQDN few instants after the PHP-FPM service started.

When I (re)start the PHP-FPM service, it works (resolution succeeds) a few seconds and then resolution fails.

I chrooted a PHP application (a WordPress actually) via PHP-FPM (settings `` chroot` in the PHP-FPM pool configuration file) and gave PHP what it needed:

<ul>
<li>A basic
Code:
/etc/hosts
file</li>
<li>A
Code:
mount --bind
of /etc/ssl/certs</li>
<li>A
Code:
/dev/urandom
(via
Code:
mknod
)</li>
<li>A
Code:
mount --bind
of /usr/share/zoneinfo</li>
<li>A
Code:
mount --bind
of /var/run/mysqld for the socket to MySQL.</li>
<li>A
Code:
mount --bind
of /var/run/nscd for the socket to nscd resolver.</li>
<li>A place to store PHP sessions</li>
</ul>

I noticed the issue when WordPress complained it could not download updates with:

<em>stream_socket_client(): php_network_getaddresses: getaddrinfo failed: Name or service not known stream_socket_client(): unable to connect to tcp://www.wordpress.org:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known)</em>

Sample script:

Code:
&lt;?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));
?&gt;

When it works:

Code:
gethostbynamel(): array(1) {
  [0]=&gt;
  string(13) "93.184.216.34"
}
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
  [0]=&gt;
  array(5) {
    ["host"]=&gt;
    string(15) "www.example.com"
    ["class"]=&gt;
    string(2) "IN"
    ["ttl"]=&gt;
    int(86348)
    ["type"]=&gt;
    string(1) "A"
    ["ip"]=&gt;
    string(13) "93.184.216.34"
  }
}

After a few instants:

Code:
gethostbynamel(): bool(false)
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
  [0]=&gt;
  array(5) {
    ["host"]=&gt;
    string(15) "www.example.com"
    ["class"]=&gt;
    string(2) "IN"
    ["ttl"]=&gt;
    int(86400)
    ["type"]=&gt;
    string(1) "A"
    ["ip"]=&gt;
    string(13) "93.184.216.34"
  }
}

Note that, in any case, both
Code:
dns_get_record()
and
Code:
checkdnsrr()
<strong>always</strong> works fine.

Three questions:

<ol>
<li>What makes
Code:
dns_get_record()
and
Code:
checkdnsrr()
achieve to resolve FQDN when
Code:
gethostbynamel()
fails?</li>
<li>What does
Code:
gethostbynamel()
need in a chrooted setup?</li>
<li>What could make it works only for a few moment?</li>
</ol>

Software versions:

<ul>
<li>Debian 9</li>
<li>Nginx 10.3</li>
<li>PHP 7.0.19</li>
</ul>

Thanks