2010-09-03 165 views
10

这个问题不是nginx vs apache。我对NGinx在Apache上的架构优势更感兴趣。正如我所能理解的那样 -nginx和apache web服务器

  • nginx是一个异步的,事件驱动的Web服务器,它的性能远远优于Apache。

这是为什么? Apache落后于何处?

+0

你确定Nginx是纯粹的异步? – 2017-02-18 08:48:42

回答

13

nginx严格“超越Apache”没有任何理由。对于许多加载模式,您可以配置Apache以便处理此负载。对于一些(非常繁忙的)加载模式,默认配置中的nginx可能会出现性能下降,并且可能需要微调才能正常工作。

然而,很多人都认为,nginx实际上可以“更好地”开箱即用,或者通过简单的调整。当nginx作为前端安装时,许多系统的性能都有了明显的提高,Apache移动到了后端。

主要原因是nginx是事件驱动的,并且包含处理连接生命周期的状态机。这样,你可以拥有很少的“工作者”进程,每个进程同时处理数百甚至数千个连接。对于Apache,您必须运行与连接数相同数量的子进程(或线程)。

很明显,针对一千个流程的三个流程至少应该是一个巨大的胜利。

特别是,nginx可以很容易地减少静态文件(图片,Javascript,CSS)的负载。在nginx中处理每个额外的连接是非常便宜的,因为静态文件在请求数量方面通常占大多数,所以您可以获得高效的处理。

另外,对于“慢速客户端”,nginx性能更好。当Apache直接访问Internet并且客户端通过(拥塞)线路发送请求时,您的(快速)服务器必须耐心地为(慢速)客户端提供服务,等待它消耗整个响应。因此,Apache子(或线程)不能做任何有用的事情。另一方面,Nginx的工作者只是简单地将这个缓慢的连接保留在描述符的epoll集合中,而一直处理其他连接。

从概念的角度来看,您应该始终尝试将请求的“类”与他们自己的性能配置文件和需求分开。例如,服务小静态文件就是这样的类之一;提供动态页面是另一个这样的类;提供巨大的静态文件是另一回事。将nginx引入你的系统隐式处理这种分离。

+0

Quote:*对于Apache你将不得不运行相同数量的子进程(或线程)作为连接数。*我相信这不适用,如果你使用'mpm_event'? – 2013-04-25 09:03:39

+0

不,它也适用于'mpm_event'(从阅读http://httpd.apache.org/docs/2.4/mod/event.html,'mpm_event'只是'工作人员'扭曲)。 Apache没有合适的FSM模块。 – squadette 2013-04-27 18:12:22

+0

@squadette从我对“mpm_event”代码的少量阅读中,我不同意:通过'mpm_event',工作人员只能在套接字准备就绪时执行I/O并运行handers和过滤器,例如,以同样的方式,工人用在libevent(libevhtp),切诺基等人之下。在'mpm_event'下,只有少数工人可以拥有数千个连接。 – ArtemGr 2014-04-13 15:09:42