Apache与Nginx网络模型

标签: apache nginx 网络 | 发表时间:2013-12-20 07:31 | 作者:xifeijian
出处:http://blog.csdn.net

      Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的。下面通过比较Apache和Nginx工作原理来比较。

 

      传统Apache都是多进程或者多线程来工作,假设是多进程工作(prefork),apache会先生成几个进程,类似进程池的工作原理,只不过这里的进程池会随着请求数目的增加而增加。对于每一个连接,apache都是在一个进程内处理完毕。具体是 recv(),以及根据 URI 去进行磁盘I/O来寻找文件,还有 send()都是阻塞的。其实说白了都是 apche 对于套接字的I/O,读或者写,但是读或者写都是阻塞的,阻塞意味着进程就得挂起进入sleep状态,那么一旦连接数很多,Apache必然要生成更多的进程来响应请求,一旦进程多了,CPU对于进程的切换就频繁了,很耗资源和时间,所以就导致apache性能下了,说白了就是处理不过来这么多进程了。其实仔细想想,如果对于进程每个请求都没有阻塞,那么肯定效率会提高很多。

 

      Nginx采用epoll模型,异步非阻塞。对于Nginx来说,把一个完整的连接请求处理都划分成了事件,一个一个的事件。比如accept(), recv(),磁盘I/O,send()等,每部分都有相应的模块去处理,一个完整的请求可能是由几百个模块去处理。真正核心的就是事件收集和分发模块,这就是管理所有模块的核心。只有核心模块地调度才能让对应的模块占用CPU资源,从而处理请求。拿一个HTTP请求来说,首先在事件收集分发模块注册感兴趣的监听事件,注册好之后不阻塞直接返回,接下来就不需要再管了,等待有连接来了内核会通知你(epoll的轮询会告诉进程),cpu就可以处理其他事情去了。一旦有请求来,那么对整个请求分配相应的上下文(其实已经预先分配好),这时候再注册新的感兴趣的事件(read函数),同样客户端数据来了内核会自动通知进程可以去读数据了,读了数据之后就是解析,解析完后去磁盘找资源(I/O),一旦I/O完成会通知进程,进程开始给客户端发回数据send(),这时候也不是阻塞的,调用后就等内核发回通知发送的结果就行。整个下来把一个请求分成了很多个阶段,每个阶段都很很多模块去注册,然后处理,都是异步非阻塞。异步这里指的就是做一个事情,不需要等返回结果,做好了会自动通知你。

 

      可以举一个简单的例子来说明Apache的工作流程,我们平时去餐厅吃饭。餐厅的工作模式是一个服务员全程服务客户,流程是这样,服务员在门口等候客人(listen),客人到了就接待安排的餐桌上(accept),等着客户点菜(request uri),去厨房叫师傅下单做菜(磁盘I/O),等待厨房做好(read),然后给客人上菜(send),整个下来服务员(进程)很多地方是阻塞的。这样客人一多(HTTP请求一多),餐厅只能通过叫更多的服务员来服务(fork进程),但是由于餐厅资源是有限的(CPU),一旦服务员太多管理成本很高(CPU上下文切换),这样就进入一个瓶颈。
再来看看Nginx得怎么处理?餐厅门口挂个门铃(注册epoll模型的listen),一旦有客人(HTTP请求)到达,派一个服务员去接待(accept),之后服务员就去忙其他事情了(比如再去接待客人),等这位客人点好餐就叫服务员(数据到了read()),服务员过来拿走菜单到厨房(磁盘I/O),服务员又做其他事情去了,等厨房做好了菜也喊服务员(磁盘I/O结束),服务员再给客人上菜(send()),厨房做好一个菜就给客人上一个,中间服务员可以去干其他事情。整个过程被切分成很多个阶段,每个阶段都有相应的服务模块。我们想想,这样一旦客人多了,餐厅也能招待更多的人。

        不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。

  所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。我随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价值。

  再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。这个时候多进程或线程就体现出优势,每个进程各干各的事,互不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与事件机制相辅相成,长期存在。

  总结之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。

 

作者:xifeijian 发表于2013-12-19 23:31:31 原文链接
阅读:141 评论:0 查看评论

相关 [apache nginx 网络] 推荐:

Apache与Nginx网络模型

- - CSDN博客互联网推荐文章
      Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的. 下面通过比较Apache和Nginx工作原理来比较.       传统Apache都是多进程或者多线程来工作,假设是多进程工作(prefork),apache会先生成几个进程,类似进程池的工作原理,只不过这里的进程池会随着请求数目的增加而增加.

nginx风头正劲 挑战 Apache 和 IIS

- nikelius - cnBeta全文版
说到Web服务器,Apache服务器和互联网信息服务系统(IIS)服务器是两大巨头;但是运行速度更快、更灵活的对手:nginx正在迎头赶上. 过去的日子对Web服务器管理员来说轻松得很. 如果你管理的部门使用Windows,就使用IIS服务器;如果不是,就使用Apache服务器. 而现在,你在Web服务器方面有了更多的选择;主要的替代服务器之一:开源nginx Web服务器正在迅速发展起来.

Apache 2.4发布 直接瞄准Nginx

- - cnBeta.COM
感谢 tianmao的投递. 新闻来源:solidot. 最流行的Web Server 发布了一个重大升级版, Apache HTTP Server 2.4的一个重要目标是大幅改进性能. 新版改进了缓存、代理模块,会话控制,改进异步读写支持,等等. Apache HTTP Server项目管理委员会和Apache基金会主席Jim Jagielski表示,他们希望终端用户能真正看到性能进步,表示Apache 2.4比许多以速度见长的Web Server更快,例如Nginx.

Apache与Nginx的优缺点比较

- - 企业架构 - ITeye博客
1、nginx相对于apache的优点: . 轻量级,同样起web 服务,比apache 占用更少的内存及资源 . 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 . 高度模块化的设计,编写模块相对简单 . 社区活跃,各种高性能模块出品迅速啊 .

Apache与Nginx的优缺点比较

- - 企业架构 - ITeye博客
Apache与Nginx的优缺点比较  . 1、nginx相对于apache的优点: . 轻量级,同样起web 服务,比apache 占用更少的内存及资源 . 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 . 高度模块化的设计,编写模块相对简单 .

让Apache 和nginx支持跨域访问

- - ITeye博客
1,如何让Apache支持跨域访问呢? . 修改httpd.conf,windows中对应的目录是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf. 把LoadModule headers_module modules/mod_headers.so 前面的注释删除.

Apache与Nginx的点点滴滴

- - 开源软件 - ITeye博客
1、Apache默认是采用HTTP1.0的,开启HTTP1.1的方式如下:. 2、采用反向代理的参数:ProxyRequests off;. 3、通过Apache代理目标系统,可以修改目标系统response中Set-Cookie中的参数,.   如:domain、path等的修改,格式如下:.    例如:ProxyPassReverseCookieDomain .cnd.com .10.3.20.205.

Nginx 和 Apache 各有什么优缺点?

- - zzm
1、nginx相对于apache的优点:. 轻量级,同样起web 服务,比apache占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊. apache 相对于nginx 的优点:.

Jelastic 1.9支持FTP、NGINX缓存、Apache TomEE以及MariaDB 10

- - InfoQ cn
支持Java和PHP的PaaS云服务器托管平台 Jelastic发布了1.9版本,该版本将支持FTP/FTPS和 NGINX缓存. 最新版还支持 Apache TomEE(Apache Tomcat企业版)和 MariaDB 10,后者使得让开发者能够充分利用多源复制、动态列名以及 MariaDB Galera集群.

(转)apache与nginx防御webbench等工具攻击

- - jackyrong
webbench是一个普遍的压力测试工具. Shell代码  收藏代码. 导致打开url缓慢,甚至服务器down机. 实:apache与nginx可以通过http_user_agent这个系统变量来做处理. apache添加rewrite规则:. nginx在server里添加判断. mod_rewrite用”FLAGS”来建立重写条件以及其他属性.