让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.8
和nameserver 8.8.4.4
添加到 /etc/resolv.conf 。 (之前我没有这样做,因为DHCP服务器正确提供了名称服务器!)
我将domain localhost
1 添加到 /etc/resolv.conf 和127.0.0.1 localhost
1 的/ etc /主机
我在监狱里安装了一个名字服务器。
我在jail (oops)之外安装了一个名称服务器。
我在监狱里安装了 / proc 。
毋庸置疑,实际上并没有解决问题,所以请帮助我。
从 debian-7.4.0-amd64-netinst.iso 安装Debian Wheezy并使用除软件选择之外的所有内容的默认设置,仅保留< em>标准系统在那里检查。
意识到不选择不太远的镜子是错误的。
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
在安装Debootstrap,Nginx和PHP-FPM之前,请确保所有内容都是最新的。
aptitude update && aptitude -y full-upgrade
aptitude -y install debootstrap nginx php5-fpm
使用Debootstrap为网站创建chroot jail。
debootstrap wheezy /srv/localhost http://ftp.de.debian.org/debian/
1
使用先前创建的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
配置并启用该网站。
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
稍微调整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;
为网站创建一个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
删除Nginx和PHP-FPM配置示例。
rm /etc/nginx/sites-enabled/default /etc/php5/fpm/pool.d/wwww.conf
重新启动PHP-FPM和Nginx服务。
service php5-fpm restart && service nginx restart
检查输出。
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 />
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
1 我的所有实际域名都已被localhost替换,而我的实际IP地址则被127.0.0.1替换。
2 我已经导出了Oracle®VirtualBox设备,并将其上传到Mega.co.nz(root密码为密码),供所有真正非常渴望的人使用帮助我。
答案 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中(无论如何都需要测试它),包括它依赖库等。