- 论坛徽章:
- 0
|
1、Apache 多进程模型的实现方法及其优势
Apache有两种工作模型,一种是基于进程的prefork模型,一种是基于线程和进程混合的Worker模型
1.1 prefork 控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。
可根据服务器的负载来调整这个值。MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以 处理的请求就越多,但Apache默认的限制不能大于256。
1.2 相对于prefork,worker全新的支持多线程和多进程混合模型的MPM。由于 使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以 获得基于进程服务器的稳定性。Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
1.3 相对来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。需要对网站进行行为分析。一般是分析日志。然后再根据实际情况做判断。
2、Nginx事件驱动模型的实现方法及其优势
2.1 克服了多线程模型的并发量缺点,对请求采用事件驱动方式处理,这里的事件通常是IO事件,其底层的实现依赖于非阻塞IO和IO多路复用。事件驱动模型很适合于IO密集型的应用,这种应用对CPU消耗代价甚至要小于线程间的切换代价,比如各种proxy。而现在的proxy,基本都标配Epoll,使得能支持的并发请求数在万级别。像lightty、nginx,是事件驱动模型的经典应用,请求的处理流程是由状态机驱动的,每次状态的切换经由一次事件触发,这样单线程就够用了(当然,如果需要支持更高的处理能力,可以采用多进程的事件驱动模型)。
2.2事件驱动的缺点在于:1)单个处理阶段不能阻塞太长,如果有这方面的问题,一般可采用专门的线程处理,处理完了再触发事件让主线程接着处理。2)整个事件驱动流程通常是固定的,在一个线程内由调度器完成,这使得它很难做的通用,使应用可以自定义流程。
3、Apache 和 Nginx 对 HTTP 协议的处理细节(协议的解析等)
HTTP协议过于庞大复杂,就以为例:
1、Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记 (Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Mon, 22 Nov 2010 16:29:24 GMT客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:
If-Modified-Since: Mon, 22 Nov 2010 16:29:24 GMT如果服务器端的资源没有变化,则自动返回 HTTP 304 (NotChanged.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类 似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
注:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求
2、Etag工作原理
HTTP 协议规格说明定义ETag为”被请求变量的实体标记” (参见14.19)。简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:
Etag: "xok.la-961AA72-4CEA99B4415628″客户端的查询更新格式是这样的:
If-None-Match: "xok.la-961AA72-4CEA99B4415628″如果ETag没改变,则返回状态304。
即:在客户端发出请求 后,Http Reponse Header中包含 Etag: “xok.la-961AA72-4CEA99B4415628″
标识,等于告诉Client端,你拿到的这个的资源有表示 ID:xok.la-961AA72-4CEA99B4415628。当下次需要发Request索要同一个 URI的时候,浏览器同时发出一个If-None-Match报头( Http RequestHeader)此时包头中信息包含上次访问得到的Etag: “xok.la-961AA72-4CEA99B4415628″标识。
If-None-Match: "xok.la-961AA72-4CEA99B4415628",这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果 If- None-Match为False,不返回200,返回304 (Not Modified) Response。
3、Expires
给出的 日期/时间后,被响应认为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客 户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。
4、Apache 和 Nginx 各自使用的场景
Apache 后台服务器(主要处理php及一些功能请求 如:中文url)
Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)
总体来说,随着nginx功能得完善将使他成为今后web server得主流。 |
|