Nginx为何会比Apache Httpd高效

常见的web服务方式

Web服务器要为用户提供服务,必须以某种方式,工做在某个套接字上。通常Web服务器在处理用户请求是,通常有以下三种方式可选择:多进程方式、多线程方式、异步方式。html

多进程方式:为每一个请求启动一个进程来处理。因为在操做系统中,生成进程、销毁进程、进程间切换都很消耗CPU和内存,当负载高是,性能会明显下降。
优势: 稳定性!因为采用独立进程处理独立请求,而进程之间是独立的,单个进程问题不会影响其余进程,所以稳定性最好。nginx

缺点: 资源占用!当请求过大时,须要大量的进程处理请求,进程生成、切换开销很大,并且进程间资源是独立的,形成内存重复利用。web

多线程方式:一个进程中用多个线程处理用户请求。因为线程开销明显小于进程,并且部分资源还能够共享,所以效率较高。
优势:开销较小!线程间部分数据是共享的,且线程生成与线程间的切换所需资源开销比进程间切换小得多。apache

缺点:稳定性!线程切换过快可能形成线程抖动,且线程过多会形成服务器不稳定。缓存

异步方式:使用非阻塞方式处理请求,是三种方式中开销最小的。但异步方式虽然效率高,但要求也高,由于多任务之间的调度若是出现问题,就可能出现总体故障,所以使用异步工做的,通常是一些功能相对简单,但却符合服务器任务调度、且代码中没有影响调度的错误代码存在的程序。
优势:性能最好!一个进程或线程处理多个请求,不须要额外开销,性能最好,资源占用最低。服务器

缺点:稳定性!某个进程或线程出错,可能致使大量请求没法处理,甚至致使整个服务宕机。多线程

一个web请求的处理过程

客户发起状况到服务器网卡;
服务器网卡接受到请求后转交给内核处理;
内核根据请求对应的套接字,将请求交给工做在用户空间的Web服务器进程
Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)
内核发现web服务器进程请求的是一个存放在硬盘上的资源,所以经过驱动程序链接磁盘
内核调度磁盘,获取须要的资源
内核将资源存放在本身的缓冲区中,并通知Web服务器进程
Web服务器进程经过系统调用取得资源,并将其复制到进程本身的缓冲区中
Web服务器进程造成响应,经过系统调用再次发给内核以响应用户请求
内核将响应发送至网卡
网卡发送响应给用户
经过这样的一个复杂过程,一次请求就完成了。并发

简单来讲就是:用户请求-->送达到用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源->返回到用户空间->响应给用户。负载均衡

Apache Httpd的工做模式

4.1 apache三种工做模式
咱们都知道Apache有三种工做模块,分别为prefork、worker、event。异步

prefork:多进程,每一个请求用一个进程响应,这个过程会用到select机制来通知。
worker:多线程,一个进程能够生成多个线程,每一个线程响应一个请求,但通知机制仍是select不过能够接受更多的请求。
event:基于异步I/O模型,一个进程或线程,每一个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的。
4.2 prefork的工做原理
若是不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是 Apache1.3中采用的模式。prefork自己并无使用到线程,2.0版使用它是为了与1.3版保持兼容性;另外一方面,prefork用单独的子进程来处理不一样的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。

4.3 worker的工做原理
相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM。因为使用线程来处理,因此能够处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。可是,worker也使用了多进程,每一个进程又生成多个线程,以得到基于进程服务器的稳定性,这种MPM的工做方 式将是Apache2.0的发展趋势。

4.4 event 基于事件机制的特性
一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其余机制来处理,经过epoll机制来通知请求是否完成;在这个过程当中,进程自己一直处于空闲状态,能够一直接收用户请求。能够实现一个进程程响应多个用户请求。支持持海量并发链接数,消耗更少的资源。

如何提升Web服务器的并发链接处理能力

有几个基本条件:

基于线程,即一个进程生成多个线程,每一个线程响应用户的每一个请求。
基于事件的模型,一个进程处理多个请求,而且经过epoll机制来通知用户请求完成。
基于磁盘的AIO(异步I/O)
支持mmap内存映射,mmap传统的web服务器,进行页面输入时,都是将磁盘的页面先输入到内核缓存中,再由内核缓存中复制一份到web服务器上,mmap机制就是让内核缓存与磁盘进行映射,web服务器,直接复制页面内容便可。不须要先把磁盘的上的页面先输入到内核缓存去。
恰好,Nginx 支持以上全部特性。因此Nginx官网上说,Nginx支持50000并发,是有依据的。

Nginx 工做原理

Nginx会按需同时运行多个进程:一个主进程(master)和几个工做进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。全部进程均是仅含有一个线程,并主要经过“共享内存”的机制实现进程间通讯。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

主进程主要完成以下工做:
读取并验正配置信息;
建立、绑定及关闭套接字;
启动、终止及维护worker进程的个数;
无须停止服务而从新配置工做特性;
控制非中断式程序升级,启用新的二进制程序并在须要时回滚至老版本;
从新打开日志文件;
编译嵌入式perl脚本;
worker进程主要完成的任务包括:
接收、传入并处理来自客户端的链接;
提供反向代理及过滤功能;
nginx任何能完成的其它任务;
注:若是负载以CPU密集型应用为主,如SSL或压缩应用,则worker数应与CPU数相同;若是负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为CPU个数的1.5或2倍。

为何选择Nginx

在高链接并发的状况下,Nginx是Apache服务器不错的替代品: Nginx在美国是作虚拟主机生意的老板们常常选择的软件平台之一. 可以支持高达 50,000 个并发链接数的响应, 感谢Nginx为咱们选择了 epoll and kqueue 做为开发模型。Nginx做为负载均衡服务器: Nginx 既能够在内部直接支持 Rails 和 PHP 程序对外进行服务, 也能够支持做为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不管是系统资源开销仍是CPU使用效率都比 Perlbal 要好不少。做为邮件代理服务器: Nginx 同时也是一个很是优秀的邮件代理服务器(最先开发这个产品的目的之一也是做为邮件代理服务器), Last.fm 描述了成功而且美妙的使用经验.Nginx 安装很是的简单 , 配置文件很是简洁(还可以支持perl语法),Bugs 很是少的服务器: Nginx 启动特别容易, 而且几乎能够作到7*24不间断运行,即便运行数个月也不须要从新启动. 你还可以 不间断服务的状况下进行软件版本的升级 。Nginx 的诞生主要解决C10K问题

相关文章
相关标签/搜索