Apache与Nginx的异同:从实践角度分析

Apache 和 Nginx是世界上两个最常用的开源web服务。这俩货负责处理互联网上差不多50%的流量。Apache 和 Nginx都可以处理各种不同工作量的任务,并且可以和其它软件一起组成完整的web框架。

虽然Apache和Nginx有很多相同的特性,但是它们谁也不能取代谁。每个都在某方面有自己的特长,理解它们各自的特点可以让你更明智的选择使用哪个做为web服务器。下面我们来讨论Apache和Nginx的异同。


概括

在我们介绍Apache和Nginx的异同之前,我们先来看一看这两个项目的起源和基本特性。

Apache

Apache项目是由Robert McCool在1995年发起,在1999年时,Apache Software Foundation接手Apache项目。这个项目到目前为止也是Apache软件基金会最成功的项目。

自从1996年开始,apache就已经成为互联网上最流行的web服务程序。很多管理员选择Apache是因为它灵活,功能强大,还有社区支持。它使用动态加载模块系统来支持扩展。

Nginx

在2002年,lgor Sysoev开始开发Nginx。他开发Nginx的目的是为了解决C10K问题,所谓C10K问题,指让服务器可以同时处理一万次(10K)并发请求。Nginx在2004年发布了第一个正式版本,它使用异步,事件驱动架构。

由于Nginx占用系统资源少,它很快流行起来。很多管理员选择Nginx就是因为它高效,在高负载下也有很快的响应,并且很好的支持代理。


连接处理架构

Apache和Nginx一个最大的不同在于,它们处理连接的方式不同。

Apache

Apache使用多路处理模型(Multi-processing模型-MPM),它决定了怎么处理客户端请求。MPM有如下3种连接架构可供选择:

  • mpm_prefork:这个模型生成多个进程用来处理请求,每个进程只有一个线程处理连接请求。当请求数比进程数少时,这个MPM模型还是很快的;但是,当请求数比进程数多时,它的效率快速下降。由于每个进程消耗的内存比较大,所以这个模型难以扩展。在很多情况下这并不是一个很好的选择。但是当涉及到和线程不安全的软件集成时,它也许是很好的选择,例如使用mod_php,同PHP(线程不安装)集成。
  • mpm_worker:这个模型生成多个进程,每一个进程可以管理多个线程,每个线程处理一个连接。线程的效率要比进程高好多,也就是为什么worker模型比prefork要高效。
  • mpm_event:这个模型和worker模型相似,它为处理keep-alive连接做了优化。当使用worker模型时,一个线程如果创建了一个连接,如果这个连接不释放,那么这个线程占用的资源也不会释放。event事件模型会有专用的线程处理keep-alive请求,它可以防止keep-alive连接把资源耗尽。它的稳定版在Apache 2.4中加入。

从上可以看到,Apache提供了灵活的架构,你可以根据实际情况,选择不同的连接和请求处理算法。这些架构的发展,对应了web服务器对高并发的要求。

Nginx

由于Nginx开发于Apache之后,它更好的处理了高并发问题。它的设计理念就是:异步、非阻塞、事件驱动连接处理算法。

Nginx生成多个工作进程,每一个进程都可以处理上千个连接。它是怎么实现的呢?工作进程实现了一个快速的loop机制,持续不断的检测并处理事件。Nginx的事件模型允许它使用有限的系统资源处理大量的并发连接。

由于Nginx不会生成新的线程来处理连接,所以,即使是在高负载的情况下,内存和CPU的使用也很稳定。


静态vs动态内容

Apache

Apache使用传统的基于文件的方法处理静态内容。

Apache不用使用外部组件,也可以处理动态内容,它使用动态processor模块处理动态内容,可以使用动态加载模块系统加载。

Nginx

Nginx本身没有处理动态内容的特性。


模块

Nginx和Apache都可以通过模块系统进行扩展,但是它们的工作方式不同。

Apache

Apache支持动态加载的卸载模块。Apache的核心不变,模块可以打开、关闭、添加、移除。

Nginx

Nginx也实现了模块系统,当是它和Apache不同。在Nginx中,模块并不能动态加载,而是在编译时配置。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注