apache — ошибка разрешения DNS под chroot php-fpm

После нескольких дней интенсивных поисков, чтобы решить мою проблему, я не мог получить ничего, что работало, так что вот оно.
Я запускаю chroot php с FastCGI и php-fpm (в Ubuntu 16.04 с php7), который работает хорошо, однако я получаю ожидаемую проблему с разрешением DNS, например, при попытке file_get_content: file_get_contents(): php_network_getaddresses: getaddrinfo failed,

Я немного посмотрел в Интернете, и вот что я уже пробовал (без успеха):

  • Я использовал методы, описанные Вот, а также пытался адаптировать этот урок чтобы скопировать все библиотеки, используемые php, и, конечно, скопировать хосты и файлы resolv
  • Я также попытался использовать nscd для связывания файла hosts внутри и вне chroot, монтируя его внутри chroot в / var / run / nscd
  • Я также получил некоторые проблемы с SSL, поэтому я скачал этот сертификат и поместите его туда, где, вероятно, отсутствовал сертификат php-curl по умолчанию (найден после openssl_get_cert_locations() : ["default_cert_file"]=> string(21) "/usr/lib/ssl/cert.pem)
    редактировать: Похоже, это мало что дает, поскольку phpinfo () не возвращает значения для файлов certs (увидеть), так что, возможно, мне следует немного подправить конфигурационный файл openssl, но я действительно не знаю, что искать.

Использование debootstrap (или других подобных программ) для меня не вариант, потому что он создает слишком большой chroot, и я хочу сделать его легким и быстрым для создания, так как на одной машине может работать много chroot.

Кроме того, вот мои файлы конфигурации, однако я сомневаюсь, что проблема здесь, потому что большинство функций php хорошо работают под chroot:

Пул php-fpm по умолчанию:

[${username}]
user = ${username}
group = www-data
listen = /run/php/php7.0-fpm.${username}.sock
listen.owner = ${username}
listen.group = www-data
pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
pm.max_requests = 250
chroot = /var/www/${username}
chdir = /

Файл виртуального хоста apache по умолчанию:

<VirtualHost *:80>
ServerName www.${domain}
ServerAlias ${domain}
ServerAdmin webmaster@${domain}
DocumentRoot /var/www/${username}/var/www/${username}
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi-${username} .php
Action php7-fcgi-${username} /php7-fcgi-${username} virtual
Alias /php7-fcgi-${username} /usr/lib/cgi-bin/php7-fcgi-${username}
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-${username} -socket /var/run/php/php7.0-fpm.${username}.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
</VirtualHost>

Спасибо !

0

Решение

Под Ubuntu 16.04 вам нужны как минимум эти файлы в вашем chroot:

etc/resolv.conf
lib/libnss_dns.so.2

Вы можете использовать жесткую ссылку, чтобы предотвратить использование дополнительного дискового пространства (работает, только если chroot находится в том же разделе, что и / lib):

ln --logical /lib/x86_64-linux-gnu/libnss_dns.so.2 /chroot/lib

Если по-прежнему происходит сбой (в будущем Ubuntu?), Вы можете отладить проблему, запустив strace -e file -fp $(pgrep fpm)

1

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

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