【问题标题】:DNS resolution error under php-fpm chrootphp-fpm chroot下的DNS解析错误
【发布时间】:2017-10-24 22:50:08
【问题描述】:

经过几天的密集搜索以解决我的问题,我找不到任何有效的方法,所以就在这里。
我正在使用 FastCGI 和 php-fpm(在 Ubuntu 16.04 和 php7 下)运行一个 chrooted php,它运行良好,但是我遇到了预期的 DNS 解析问题,例如在尝试 file_get_content 时:file_get_contents(): php_network_getaddresses: getaddrinfo failed

我在网上看了很多,这是我已经尝试过的(没有成功):

  • 我使用了here描述的方法,也尝试了适配this tutorial以便复制所有php使用的库,当然也复制了hosts和resolv files
  • 我还尝试使用 nscd 将主机文件挂载到 /var/run/nscd 的 chroot 内,从而链接 chroot 内外的主机文件
  • 我也遇到了一些 SSL 问题,所以我下载了 this certificate 并将其放在可能缺少默认 php-curl 证书的位置(在 openssl_get_cert_locations() 之后找到:["default_cert_file"]=> string(21) "/usr/lib/ssl/cert.pem
    编辑: 这似乎没有多大作用,因为 phpinfo() 没有为证书文件返回任何值(see),所以也许我应该稍微调整一下 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>

谢谢!

【问题讨论】:

    标签: php apache dns chroot


    【解决方案1】:

    在 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) 来调试问题

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多