我想配置一个 NGINX 服务器,它能够托管多个网站,这些网站彼此独立,因此vhosta
无法从 访问文件vhostb
。
我安装了全新的 Debian 7.5 服务器,并从默认的 Debian 包中安装了 NGINX 和 PHP FPM。
然后我将添加 2 个新用户vhosta
,vhostb
并将 NGINX webserver 用户添加www-data
到每个用户的组中。
接下来我创建了以下目录结构。
var/
|---www/
|---vhosta
|---httpdocs (permissions 750 - owner: vhosta - group: vhosta)
|---vhostb
|---httpdocs (permissions 750 - owner: vhostb - group: vhostb)
我为每个虚拟主机配置了一个单独的 PHP FPM 池,以分离每个虚拟主机的 PHP 进程。配置如下(仅供参考vhosta
)
[vhosta]
listen = /var/run/php5-fpm-vhosta.sock
user = vhosta
group = vhosta
listen.owner = vhosta
listen.group = vhosta
据我所知,此配置应vhosta
与访问vhostb's
httpdocs 目录中的文件分开,因为vhosta
没有对 httpdocs 文件夹的访问权限vhosta
。我通过尝试在 中创建一个简单的 PHP 脚本来验证这一点vhosta
,该脚本尝试访问 httpdocs 目录中的文件vhostb's
。
到目前为止一切顺利。我安装了一个 PHP 应用程序 (CMS),vhosta
并使用 ApacheBench 进行了一些性能测试。
总体而言,一切都比使用 Apache2 运行得更顺畅、更快,最终我会得到以下结果。
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/
这样做之后,vhosts 就不能访问 /etc/passwd 等文件了。我创建了一个简单的 PHP 脚本,用于验证 vhosts 是否无法访问配置目录之外的文件。
最后,我重复了性能测试并得到以下结果。
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 指令会导致性能大幅下降。与使用 Apache2 和 mod_php 的设置相比,访问时间和每秒请求量现在相当相似。
我的问题如下:
我创建的设置是否可以被视为“安全”,以便各个虚拟主机无法相互访问?如果不是,那么最佳做法是什么?我遗漏了什么?
为什么当我使用 open_basedir 时,性能会下降这么多?或者不使用 open_basedir 更安全,因为 /etc/passwd 之类的文件无论如何都是可读的?
答案1
如果您确实希望他们无法访问系统上的任何实际内容,请为 php-fpm 设置 chroot,从而创建一个“假的” /etc/passwd 等等。或者,更简单的方法是使用 docker!
1) 我不确定您是如何设置要从这些虚拟主机加载的静态文件的,因为在这种情况下它们不应该被加载,也许只有当您将所有内容传递给 php-fpm 时才会加载,这会使您受到其他类型的攻击并降低性能。通常,您会像这样设置权限(考虑到 nginx 是运行 nginx 进程的用户):
- /var/vhosta :所有者 vhosta.nginx ;权限 750
- /var/vhostb :所有者 vhostb.nginx ;权限 750
2) 我不是 100% 确定,但是如果您有一个加载大量文件的复杂应用程序,并且您的 I/O 无法提供良好的性能,那么它可能有意义。open_basedir 限制会执行诸如检查文件是否不是符号链接或是否在符号链接内等操作,从而发出大量 I/O 请求,从而提高磁盘的 IOPS。使用 docker 或至少 chroot 的另一个原因。