我想configuration一个能够托pipe多个网站的NGINX服务器,这个网站是相互独立的,所以vhosta不能从vhostb访问文件。
我安装了一个新的Debian 7.5服务器,并从默认的debian软件包中安装了NGINX和PHP FPM。
然后,我将添加2个新用户vhosta和vhostb ,并将NGINX web服务器用户www-data到每个用户的组中。
接下来我创build了以下目录结构。
var/ |---www/ |---vhosta |---httpdocs (permissions 750 - owner: vhosta - group: vhosta) |---vhostb |---httpdocs (permissions 750 - owner: vhostb - group: vhostb)
我为每个虚拟主机configuration了一个单独的PHP FPM池,以便为每个虚拟主机分离PHP进程。 configuration如下(只显示vhosta )
[vhosta] listen = /var/run/php5-fpm-vhosta.sock user = vhosta group = vhosta listen.owner = vhosta listen.group = vhosta
据我所知,这个configuration应该单独访问vhostb's httpdocs目录中的文件,因为vhosta没有从vhosta的httpdocs文件夹的访问权限。 我validation了这一点,试图在vhosta创build一个简单的PHP脚本,该脚本尝试访问vhostb's httpdocs目录中的文件。
到现在为止还挺好。 我在vhosta安装了一个PHP应用程序(CMS),并使用ApacheBench进行了一些性能testing。
一般来说,一切运行都比Apache2更stream畅,更快,我将得到以下结果。
Requests per second: 31.62 [#/sec] (mean) Time per request: 316.209 [ms] (mean) Time per request: 31.621 [ms] (mean, across all concurrent requests) Transfer rate: 430.58 [Kbytes/sec] received
那么,在这一点上,我每秒31.62个请求是好的。
最后,我想访问限制vhosta和vhostb目录的子集,所以他们没有访问其他世界可读的系统文件。 我这样做,通过使用PHP指令open_basedir。
我已经添加了以下每个虚拟主机PHP FPM池(只显示vhosta )
php_admin_value[open_basedir] = /var/www/vhosta/httpdocs/:/tmp/
这样做,虚拟主机不应该能够访问例如/ etc / passwd。 我创build了一个简单的PHP脚本,它validation虚拟主机无法从configuration的目录以外访问文件。
最后,我重复了性能testing,最终得出以下结果。
Requests per second: 11.82 [#/sec] (mean) Time per request: 8460.087 [ms] (mean) Time per request: 84.601 [ms] (mean, across all concurrent requests) Transfer rate: 161.18 [Kbytes/sec] received
看来,向PHP FPM池中添加open_basedir指令会导致性能下降。 现在访问时间和每秒请求数量与使用mod_php的Apache2的设置相比是相当相似的。
我的问题如下:
我创build的设置可以被认为是“安全的”,所以单个虚拟主机不能访问对方? 如果没有,那么最好的做法是什么?我错过了什么?
当我使用open_basedir时,为什么性能会下降很多? 还是保存不使用open_basedir,因为像/ etc / passwd这样的文件无论如何都是世界可读的?
如果你真的希望他们不能访问系统中的任何东西,请为PHP-fpm设置chroot,从而创build一个“假”/ etc / passwd等等。 或者,更容易,使用docker!
1)我不知道你是如何设置从这些虚拟主机加载的静态文件,因为它们不应该被加载在这种情况下,也许只有当你把所有的东西都传递给php-fpm,攻击和降低性能。 通常你会把这样的权限(考虑到nginx是运行nginx进程的用户):
2)我不是100%肯定,但是如果你有一个复杂的应用程序加载大量的文件,并且你的I / O不能提供良好的性能,那么它可能是有道理的。 open_basedir的限制做的东西,如检查文件是不是一个符号链接或在一个符号链接等,造成大量的I / O请求,从而提高您的磁盘的IOPS。 还有一个理由使用docker工人或至lesschroot。