当chrooted shell没有时,为什么chrooted PHP(FPM)存在DNS问题?

时间:2014-04-18 13:48:18

标签: php linux web-services networking nginx

我想做什么:

让Nginx通过FastCGI(FPM)从使用debootstrap创建的chroot jail中提供PHP文件。

问题:

将主机名解析为IP地址的每个功能都会失败,并显示php_network_getaddresses: getaddrinfo failed: Name or service not known。这有点奇怪的是,从chrooted shell解析主机名没有问题。

到目前为止我做了什么:

  • 我在监狱外禁用了防火墙。

  • 我将 /etc/resolv.conf /etc/nsswitch.conf 和其他一些文件(which I found here)复制到了jail中。 (感谢Debootstrap,所有这些已经存在,但无论如何我都替换了它们!)

  • 我将nameserver 8.8.8.8nameserver 8.8.4.4添加到 /etc/resolv.conf (之前我没有这样做,因为DHCP服务器正确提供了名称服务器!)

  • 我将domain localhost 1 添加到 /etc/resolv.conf 127.0.0.1 localhost 1 的/ etc /主机

  • 我在监狱里安装了一个名字服务器。

  • 我在jail (oops)之外安装了一个名称服务器。

  • 我在监狱里安装了 / proc

毋庸置疑,实际上并没有解决问题,所以请帮助我。

重现这一步所需的所有步骤:

  1. debian-7.4.0-amd64-netinst.iso 安装Debian Wheezy并使用除软件选择之外的所有内容的默认设置,仅保留< em>标准系统在那里检查。

  2. 意识到不选择不太远的镜子是错误的。

    vi /etc/apt/sources.list并使文件看起来像这样:

    deb http://ftp.de.debian.org/debian/ wheezy main contrib non-free
    deb-src http://ftp.de.debian.org/debian/ wheezy main contrib non-free
    
    deb http://security.debian.org/ wheezy/updates main
    deb-src http://security.debian.org/ wheezy/updates main
    
    deb http://ftp.de.debian.org/debian/ wheezy-updates main
    deb-src http://ftp.de.debian.org/debian/ wheezy-updates main
    
  3. 在安装Debootstrap,Nginx和PHP-FPM之前,请确保所有内容都是最新的。

    aptitude update && aptitude -y full-upgrade

    aptitude -y install debootstrap nginx php5-fpm

  4. 使用Debootstrap为网站创建chroot jail。

    debootstrap wheezy /srv/localhost http://ftp.de.debian.org/debian/ 1

  5. 使用先前创建的jail中的测试文件创建名为 www 的目录,并使 www-data 成为所有者。

    mkdir /srv/localhost/srv/www 1

    echo "<?php fsockopen('ftp.de.debian.org'); ?>" > /srv/localhost/srv/www/index.php 1

    chown -R 33:33 /srv/localhost/srv/www 1

  6. 配置并启用该网站。

    vi /etc/nginx/sites-available/localhost 1 并使文件看起来像 1

    server {
      listen 127.0.0.1:80;
    
      server_name localhost;
    
      root /srv/localhost/srv/www;
      index index.html index.htm index.php;
    
      location ~ \.php$ {
        try_files     $uri =404;
        fastcgi_pass  unix:/var/run/localhost.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
        include       fastcgi_params;
      }
    
      location / {
        try_files $uri $uri/ /index.html;
      }
    
      location ~* \.(jpg|jpeg|gif|png|css|js|ico)$ {
        access_log off;
      }
    
      location = /favicon.ico {
        log_not_found off;
      }
    
      location ~ /\. {
        deny          all;
        access_log    off;
        log_not_found off;
      }
    }
    

    ln -s /etc/nginx/sites-available/localhost /etc/nginx/sites-enabled/ 1

  7. 稍微调整Nginx提供的FastCGI参数。

    vi /etc/nginx/fastcgi_params并使文件看起来像这样:

    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;
    
    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  HTTPS              $https if_not_empty;
    
    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
    
    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;
    
    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;
    
  8. 为网站创建一个PHP-FPM池(?)。

    vi /etc/php5/fpm/pool.d/localhost.conf 1 并使文件看起来像 1

    [localhost]
    
    user  = www-data
    group = www-data
    
    listen                 = /var/run/localhost.sock
    listen.allowed_clients = 127.0.0.1
    
    pm                      = ondemand
    pm.max_children         = 5
    pm.process_idle_timeout = 300s
    pm.max_requests         = 500
    
    ;access.log    = log/$pool.access.log
    ;access.format = "%R - %u %t \"%m %r\" %s"
    
    chroot = /srv/localhost/srv
    chdir  = /
    
    ;catch_workers_output = yes
    
    ;security.limit_extensions = .php .php3 .php4 .php5
    
    php_flag[display_errors]           = on
    php_admin_flag[log_errors]         = on
    php_admin_value[error_log]         = /var/log/php.log
    php_admin_value[memory_limit]      = 32M
    php_admin_value[session.save_path] = /tmp
    
    
    env[HOSTNAME] = $HOSTNAME
    env[PATH]     = /usr/local/bin:/usr/bin:/bin
    env[TMP]      = /tmp
    env[TMPDIR]   = /tmp
    env[TEMP]     = /tmp
    
  9. 删除Nginx和PHP-FPM配置示例。

    rm /etc/nginx/sites-enabled/default /etc/php5/fpm/pool.d/wwww.conf

  10. 重新启动PHP-FPM和Nginx服务。

    service php5-fpm restart && service nginx restart

  11. 检查输出。

    wget -qO- http://localhost 1 打印:

    <br />
    <b>Warning</b>:  fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in <b>/www/index.php</b> on line <b>1</b><br />
    <br />
    <b>Warning</b>:  fsockopen(): unable to connect to ftp.de.debian.org:80:-1 (php_network_getaddresses: getaddrinfo failed: Name or service not known) in <b>/www/index.php</b> on line <b>1</b><br />
    
  12. Chroot进入监狱,只是为了看到解析主机名没有问题

    chroot /srv/localhost/ 1

    ping -c1 ftp.de.debian.org打印:

    PING ftp.de.debian.org (141.76.2.4) 56(84) bytes of data.
    64 bytes from ftp.de.debian.org (141.76.2.4): icmp_req=1 ttl=56 time=15.1 ms
    
    --- ftp.de.debian.org ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 15.137/15.137/15.137/0.000 ms
    

  13. 1 我的所有实际域名都已被localhost替换,而我的实际IP地址则被127.0.0.1替换。

    2 我已经导出了Oracle®VirtualBox设备,并将其上传到Mega.co.nz(root密码为密码),供所有真正非常渴望的人使用帮助我。

1 个答案:

答案 0 :(得分:2)

我不知道为什么会这样,但你可能会发现使用strace。要安装strace,你需要apt-get install strace。然后你得到ps ax | grep nginx的nginx的PID。然后是实际的支撑:

strace -f -s 1024 -p PIDOFNGINX -o /tmp/trace.out

然后你启动wget -qO- http://localhost,停止nginx(或杀死strace),然后查看/tmp/trace.out以及它抛出错误的位置。可能你的chroot中缺少一些库。
编辑:
你写完你所做的事的方式实际上并没有在chroot中执行test-ping。那应该是:

chroot /srv/localhost /bin/ping -c1 ftp.de.debian.org

然后你可以实际上ping那个ping,然后从nginx中包含更少的东西。这将要求ping命令也在chroot中(无论如何都需要测试它),包括它依赖库等。