同时使用Nginx和Apache来处理静态和dynamic文件

背景:

我search了很多,发现了有关使用Apache或NginX的静态或dynamic文件的有用线程。 但是他们已经很老了(大部分大概在1到2年前),我认为这两个网页服务器,特别是Nginx在性能和使用方面都有重要的变化。 所以我觉得再看看这些问题不能那么糟糕。

  • Nginx(用于静态文件)和Apache(用于dynamic内容)?
  • nginx比apache更适合dynamic内容? [closures]
  • Apache或NGINX的PHP
  • Nginx作为只有dynamic内容的Apache的反向代理?

我的问题:

我有一个PHP Web应用程序,它有很多dynamic文件和大量的静态内容(video,图片等),目前在2个月前运行在CentOS 6服务器和Apache 2.2上。

在过去的几天里,我们的网站访问者数量增长如此之快,我只是想,如果这个数量继续以stream量比例增长,我们需要改变许多事情(networking服务器,应用程序等)来防止失败。 由于我们面临的硬件限制,我认为我们最好从web服务器开始。

  1. 我应该从别的东西开始吗? 我应该尝试提高我的PHP应用程序的性能,并忘记现在的Web服务器? (即使要花很长时间!)
  2. 由于.htaccess文件的巨大使用(用于redirect,重写等),我认为将Nginx作为默认的Web服务器或者仅仅用于dynamic文件是很痛苦的。 这是否意味着我甚至不能使用Nginx作为反向代理?
  3. 我不确定Nginx和PHP-FPM的最新稳定版本比我目前的Apache有更好的性能,我的限制(太多东西)不会让我试试看。 哪一个目前进行得更好?
  4. 迁移到Nginx会损失什么?
  5. 为了简短起见,我该怎么做?

要回答你的问题,你需要提供更多的信息。 你必须弄清楚你的瓶颈在哪里,为什么! 它是服务器资源,如CPU或内存或磁盘I / O。 如果访客数量持续上升,你认为事情会如何呢?

当你回答的时候,你需要弄清楚为什么。 你的系统是否因为它的任务而被缩小? 你的应用程序有效吗? 客户端和服务器之间的通信是否有效,例如,适当的Cache-Control头,压缩传输,less量的HTTP请求等等。

一个快速的解决scheme是将所有的静态资产踢出你的服务器。 将其托pipe在CDN中,例如使用CloudFront的S3,这些请求将永远不会影响您的服务器。

一年前我们遇到了类似的情况,当时我们的趋势图显示即将出现的问题。 我们的应用程序太过CPU了,我们通过应用程序传递所有对静态资产的请求,甚至对于公共文件也进行各种ACL检查,这导致了高负载。 我的研究表明,虽然像Nginx或Apache-worker这样的线程服务器可以帮助限制内存的使用,但对于我们的PHP进程来说,这无助于减lessCPU的使用。 我们需要简单地减lessdynamic请求的数量。

我们的解决scheme是在Apache之前安装Varnish以caching静态资产并cachingdynamic内容。 具有1G内存的单个光油实例可以在CPU负载非常低的情况下每秒处理数千个静态文件请求。 Varnish默认在caching方面非常保守,因为它不知道caching的安全性,所以不要指望立即改进。 为了得到好的结果,我们花了一些时间对应用程序进行了调整,并且您将学到很多有关HTTP和您的应用程序的知识,但是现在我们已经为Varnish提供了大约80%的CPU使用率。 这是非常有效的,已经减less了一半以上的负载在我们的服务器上。

你必须通过VCLconfiguration语言明确地告诉Varnish要caching什么,隐式地让你的应用发送正确的HTTP头。 在我们的应用程序中,我们必须改变一些事项:减less会话的使用,以减less对cookies的需求。 在Varnish中严重过滤cookies(例如:Varnish不会caching任何包含任何cookie的请求,甚至是用于Google Analytics等浏览器的Cookie)。 我们清理了所有的HTTP头文件,告诉Varnish和网页浏览器caching的内容。 我们修改了我们的CMS,发送一个调用Varnish清除caching中的URL,如果内容被编辑。 等等。

在所有方面,Varnish对我们来说都很好,因为它运行良好,并且教会了我们很多关于我们应用程序的行为。 你可以说,我强烈推荐它。

首先,找出你的实际问题是什么,所以你不要浪费时间在错误的解决scheme上。

如果你在静态和dynamic内容之间有清晰的界限,那么你可以使用nginx作为反向代理。 静态内容可以由nginx直接提供,dynamic可以代理到Apache。 这个选项比Martijnbuild议的像Varnish这样的caching要慢一些,但是如果RAM是一个限制的话,我会走这个路线。

另外,如果您确实使用nginx作为反向代理,请确保closuresapache上的gzip并保存一些CPU周期,因为nginx将在解压缩之后再压缩响应,然后再将其返回给用户。