免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

HTTP服务器实现技术细节剖析--深入学习Apache和Nginx(获奖名单已公布-2012-11-15) [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
41 [报告]
发表于 2012-10-25 17:27 |只看该作者
linux_c_py_php 发表于 2012-10-25 17:02
对于你张口就骂, 见人就咬的作风, 挂着"版主"2字真的很给所有版主丢脸, 我劝你见好就收, 免得我骂难听的, 谢 ...


大家消消火......

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
42 [报告]
发表于 2012-10-25 17:41 |只看该作者
,大家都是来讨论技术的,和气生财,不过我也比较喜欢白话一点的技术语句,好的技术文档都是越通俗易懂的,看过不少论坛和书籍,确实也有不少文章是说得没几个人能看懂的天书文档,当然这和各人的表达有关系,我觉得能把复杂的东西说得通俗易懂,这种能力是比技术更重要的本领!是一个做技术的人必须具备的文科素质!呵呵!这是个人感觉,如有不同意见欢迎反驳!

论坛徽章:
0
43 [报告]
发表于 2012-10-26 09:48 |只看该作者
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得主流。

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
44 [报告]
发表于 2012-10-26 10:28 |只看该作者
Apache 和 Nginx 都还不怎么熟悉,我是进来学习的。

论坛徽章:
2
季节之章:冬
日期:2015-01-20 17:08:47IT运维版块每日发帖之星
日期:2016-02-24 06:20:00
45 [报告]
发表于 2012-10-26 10:47 |只看该作者
sxcong 发表于 2012-10-25 08:08
回复 10# 大邪神


我的意思是,对于前面的Nginx和Apche而言,单个连接可能并不需要那么多带宽,保持一个合理的带宽就可以了,剩下的资源要为其他的连接服务,但是tomcat就不一样,本身是处理业务逻辑的,对于单个连接会使用所有资源处理,是以说二者处理机制不同。当然,这个是我侧猜测,因为我没时间和精力去看源码。

论坛徽章:
4
CU大牛徽章
日期:2013-04-17 11:50:25CU大牛徽章
日期:2013-04-17 11:50:33CU大牛徽章
日期:2013-04-17 11:50:39CU大牛徽章
日期:2013-04-17 11:50:44
46 [报告]
发表于 2012-10-26 15:04 |只看该作者
我个人没怎么用过Apache,但是也用过,当然那还是觉得Nginx好 ,(个人偏见)
就是用着顺手了。配置啊 调优啊 等等都觉得很顺手了。其实这些web工具都大同小异。

论坛徽章:
4
CU大牛徽章
日期:2013-04-17 11:50:25CU大牛徽章
日期:2013-04-17 11:50:33CU大牛徽章
日期:2013-04-17 11:50:39CU大牛徽章
日期:2013-04-17 11:50:44
47 [报告]
发表于 2012-10-26 15:06 |只看该作者
有点深奥了...搞不明白 呵呵。改天开帖给我们讲解一下吧..!
回复 18# linux_c_py_php


   

论坛徽章:
27
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:24:09CU大牛徽章
日期:2013-09-18 15:24:20CU大牛徽章
日期:2013-09-18 15:24:25CU大牛徽章
日期:2013-09-18 15:24:31CU大牛徽章
日期:2013-09-18 15:24:36CU大牛徽章
日期:2013-09-18 15:24:41CU大牛徽章
日期:2013-09-18 15:24:48CU大牛徽章
日期:2013-09-18 15:24:52处女座
日期:2013-09-27 17:45:43
48 [报告]
发表于 2012-10-26 18:25 |只看该作者
很久以前做过nginx模块开发,nginx把各个请求数包构建成一个链式结构,事件触发了就一个个处理,因此非常快。nginx模块开发非常方便,但是只有一个简单的例子,资料非常少

论坛徽章:
0
49 [报告]
发表于 2012-10-26 21:13 |只看该作者
lenky0401 发表于 2012-10-24 13:49
反向代理或正向代理,既然说到反向/正向,那么也就表明是按代理方向来看的,而这个方向具体是站在客户端 ...


精辟,看了后再理解原来这么简单

论坛徽章:
0
50 [报告]
发表于 2012-10-27 18:17 |只看该作者
如何处理http协议确实不懂,多少人像我一样停留在基础应用这块,不方便多说了,哈哈,看高手们爆料,

个人觉得没写过简单http服务器实现相关代码,根本看不懂相关底层实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP