同时使用 NginX 和 Apache 处理静态和动态文件

同时使用 NginX 和 Apache 处理静态和动态文件

背景:

我搜索了很多,找到了关于使用 Apache 或 NginX 处理静态或动态文件的有用帖子。但它们已经过时了(大部分是 1 或 2 年前的),而且我认为这两个 Web 服务器,特别是 Nginx,在性能和使用方面都发生了重大变化。所以我认为重新审视这些问题不会那么糟糕。

我的问题:

我有一个 PHP Web 应用程序,其中包含大量动态文件和大量静态内容(视频、图像等),并且它目前在 2 个月前在 CentOS 6 服务器和 Apache 2.2 上运行。

在过去的几天里,我们网站的访客数量增长得如此之快,我只是觉得,如果这个数字继续以目前的比例增长,我们需要改变很多东西(网络服务器、应用程序等)来防止故障。由于我们面临的硬件限制,我认为我们最好从网络服务器开始。

  1. 我应该从别的事情开始吗?我是否应该尝试提高 PHP 应用程序的性能并暂时忘掉 Web 服务器?(即使要花很长时间!)
  2. 由于.htaccess文件使用量巨大(用于重定向、重写等),我认为将 NginX 迁移到默认 Web 服务器或仅用于动态文件会很麻烦。这是否意味着我甚至不能使用 Nginx 作为反向代理?
  3. 我不确定 NginX 和 PHP-FPM 的最新稳定版本是否比我当前的 Apache 性能更好,而且我的限制(太多东西)不允许我尝试。目前哪一个表现更好?
  4. 迁移到 Nginx 会有什么损失?
  5. 简而言之,我应该做什么?

答案1

要回答您的问题,您需要提供更多信息。您必须弄清楚瓶颈在哪里,以及为什么!是服务器资源(如 CPU、内存或磁盘 I/O)吗?如果访客数量持续增加,您认为哪里会出现问题?

当你回答“在哪里”时,你需要弄清楚“为什么”。你的系统是否只是不适合完成所赋予的任务?你的应用程序是否高效?客户端和服务器之间的通信是否高效,例如使用适当的 Cache-Control 标头、压缩传输、少量 HTTP 请求等?

一个快速的解决方案是将所有静态资产从您的服务器中移除。将它们托管在 CDN 中,例如使用 CloudFront 的 S3,这样请求就永远不会到达您的服务器。

一年前,我们遇到过类似的情况,当时我们的趋势图显示问题迫在眉睫。我们的应用程序占用过多的 CPU,我们将所有静态资产请求都通过应用程序进行各种 ACL 检查,甚至对公共文件也是如此,这导致负载过高。我的研究表明,虽然 Nginx 或 Apache-worker 等线程 Web 服务器有助于限制内存使用,但它不会帮助我们的 PHP 进程减少 CPU 使用率。我们只需要减少动态请求的数量。

我们的解决方案是在 Apache 前面安装 Varnish 来缓存静态资产和动态内容。一个具有 1 GB RAM 的 Varnish 实例每秒可以处理数千个静态文件请求,并且 CPU 负载非常低。默认情况下,Varnish 在缓存内容方面非常保守,因为它不知道哪些内容可以安全缓存,所以不要指望立即得到改进。我们对我们的应用程序进行了一些调整,以获得良好的结果,您将学到很多有关 HTTP 和您的应用程序的知识,但现在我们处理了 Varnish 大约 80% 的所有请求,而 CPU 使用率约为 0.2%。它非常高效,并且将我们服务器的负载减少了一半以上。

您必须告诉 Varnish 要缓存什么,要么通过其 VCL 配置语言明确地告诉,要么通过让您的应用发送正确的 HTTP 标头隐式地告诉。我们必须在应用中进行一些更改:减少会话的使用,以减少对 cookie 的需求。在 Varnish 中严格过滤 cookie(例如:Varnish 不会缓存任何包含任何 cookie 的请求,即使是用于浏览器的 cookie,如 Google Analytics)。我们清理了所有 HTTP 标头,这些标头告诉 Varnish 和 Web 浏览器要缓存什么。我们修改了 CMS,如果内容被编辑,则向 Varnish 发送调用以从缓存中清除 URL。等等。

总体而言,Varnish 对我们来说非常棒,因为它运行良好,并且教会了我们很多有关应用程序行为的知识。正如您所看到的,我强烈推荐它。

首先,弄清楚你实际的问题是什么,这样你就不会在错误的解决方案上浪费时间。

答案2

如果您的静态内容和动态内容之间有明确的界限,那么您可以使用 nginx 作为反向代理。静态内容可以直接由 nginx 提供,而动态内容可以代理到 Apache。这个选项会比使用 Varnish 之类的缓存稍慢,正如 Martijn 所建议的那样,但如果 R​​AM 是一个限制,那么我会选择这种方式。

此外,如果您确实使用 nginx 作为反向代理,请确保关闭 apache 上的 gzip 并节省几个 CPU 周期,因为 nginx 将在将响应返回给用户之前对其进行解压缩和重新压缩。

相关内容