也谈谈Apache与Nginx

不断有人跟我说Nginx比Apache好、比Apache快之类。Nginx更主要是作为反向代理,而非WEB服务器使用。我翻译过一本关于反向代理的技术书籍,同时很熟悉Apache API开发,对Nginx和Apache的工作原理都略有了解,粗谈一下看法。

不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动,例如基于内核通知的高级事件驱动epoll。事件驱动的本质还是IO事件,应用程序在多个可用的IO句柄间快速切换,实现无阻塞IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑epoll,不需要Apache那样动辄数百的进程数。至于说多少万的并发连接,这个毫无意义。我随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价值。

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

总结之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有优势,并不存在谁取代谁的倾向。两者也将会互相补充,长期存在。

此条目发表在Common分类目录,贴了标签。将固定链接加入收藏夹。

也谈谈Apache与Nginx》有一条回应

  1. debug说:

    为什么“CPU密集型的服务,事件驱动并不合适”呢?用nginx,多开几个worker,和用apache有什么区别吗?

评论已关闭。