介绍
好的,我即将推出的新生产网络存在相当复杂的问题(至少对我来说)。我正在寻求更有经验的 Linux 用户的建议,尤其是有关如何安全地设置我所描述的网络的建议。我对所有这些还是新手,但现在我负责设置这个新网络。
目前,我在 Apache 中运行着 150 多个网站,其中包括一个负载均衡器、三个 Web 服务器和一个数据服务器。目前一切正常,但是由于性能大幅提升,我正尝试在新的 Debian 中使用 nginx 设置新网络。
我阅读了大量关于 nginx 和 apache 的信息,进行了数十次测试来比较两种情况下的性能,并得出结论:高压下的 nginx(我们几乎只运行 WordPress 网站)处理请求的速度比 apache 快得多,这主要是因为静态文件(有时一页中有 100 多个,浏览器显然可以加载但仍然可以)。
当前设置
- Debian 9
- nginx 1.10.3
- php-fpm (7.0)
- ldap 3
我已将网站的所有数据挂载到每台 Web 服务器上的 /websites 目录中。nginx 和 fpm 的配置文件也位于该目录中的配置目录中。每个网站(我将使用 example.com)都有自己的用户(通过 ldap 进行身份验证),并且属于网站组(也在 ldap 中)。因此,每个用户的主目录都在 /websites 文件夹中,权限为 700,所有者为 example.com,组为网站。这样做的目的是让每个网站都在自己独立的“孤岛”中运行。
这意味着对于每个网站配置,我都有一个 php fpm 配置,它为每个用户使用不同的套接字。这意味着它只能在自己的网站目录中执行 php 文件,对吗?对于 PHP,这很好用,我宁愿不更改此配置。
问题
问题来了,nginx 速度更快,因为它直接提供静态文件,而 apache(我们之前如何配置它)使用 mpm-itk 模块为每个用户创建单独的进程,然后提供静态文件或 PHP。
Nginx 的做法有所不同,通过使用 php fpm 为每个用户提供不同的套接字,我实现了(至少使用 php)与 mpm-itk 模块对 apache 所做的相同。但是 nginx 无法做到这一点,它会尝试以 nginx 运行的用户身份(默认为 www-data)提供所有静态文件。因此,输出由 PHP 生成(工作正常),但 nginx 没有显示静态文件的权限。
我已经尝试寻找解决方案一天多了,并得出了几个不同的结论。
以 root 身份运行
我的同事说以 root 身份运行 nginx 可以解决这个问题,当然可以,但我觉得这不安全。如果我愿意,不妨删除整个“每个网站都有自己的用户”政策。
将 www-data 添加到网站组
如果我可以将 unix 用户(本例中为 www-data)添加到 ldap 组(显然我不能这样做),我可以授予该组(网站)读取权限(而不是当前的 700),以便它可以读取任何地方的静态文件。唯一的问题是,网站也可以相互读取文件,而这正是我试图避免的。所以这似乎也不是一个合适的解决方案。
SELinux
我读了一些关于 SELinux 的文档和介绍,对我来说,这似乎是一种解决这个问题的复杂方法。我从来没有用过它,像这样在生产网络上运行它似乎不是一个好主意,因为我不知道我用它做什么。
结论
那么,从我现在的情况来看,更有经验的用户会采取什么途径呢?在 SELinux 上做更多的研究?AppArmor?或者有没有另一种更简单的方法来获得与 mpm_itk 提供的相同的安全性。
这是我遇到的最后一个问题,我并不想寻找所有配置文件来设置它,而我需要执行的确切命令都已完成。
我希望有经验的人能给我一些建议或指明正确的方向。无论如何,我都会非常感激!
答案1
我认为 SELinux 值得花时间投资,当你只想确定文件夹的权限时,它实际上并不像看起来那么复杂。
但是让我出个难题... 如果主要是 Wordpress,我会选择带有 Wordpress Cache 插件的 Litespeed Webserver。通过 Web 服务器级别的缓存,您可以获得极快的 Wordpress:
https://www.litespeedtech.com/products/cache-plugins/wordpress-acceleration
而且 Litespeed 具有易于实现的内置 chroot 功能,可以解决您的安全问题:
https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:config:chroot
“chroot” 是类 Unix 系统上的一项功能,可以更改进程的根目录。更改后的根进程及其子进程无法访问新根目录之外的任何文件。这就像将进程关进具有物理文件访问边界的监狱,这也是此机制通常被称为“chroot jail”的原因。
当然,Nginx 也可以进行 chroot:
https://gir.me.uk/posts/nginx-php-fpm-with-chroot.html
Litespeed 的管理 GUI 使其变得非常简单,可能比从 CLI 执行所有操作更符合您的经验水平。
除了 Chroot 之外,您还有 SuEXEC 选项:
https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:config:suexec-mode
SuEXEC 是一项功能,允许 LiteSpeed Web Server 在 Web 服务器进程的 UID 以外的 UID(用户 ID)下运行 CGI/FastCGI/LSAPI/PHP/Ruby 或任何外部 Web 应用程序。
这进一步解决了您以 root 身份运行 Nginx 的主要担忧。
我目前在生产 Wordpress 站点中使用 Nginx 和 Litespeed。对于您描述的高流量情况,我随时都会推荐使用带有专用插件的 Litespeed。此外,您还可以获得快速文件服务的所有其他优势,这是 Nginx 和 Litespeed 与 Apache 的分水岭。