一、http的基础知识php
http是一个请求——响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器响应这个信息。
css
在老的http版本中:html
每个请求都建立一个TCP链接,当一次请求被响应后,tcp四次挥手,链接断开。
sql
这个模式的优势:数据库
简单,易实现,易理解,且知足无链接的特色。apache
这个模式的缺点:浏览器
效率低。服务器
HTTP /1.0并发
在这个版本的协议上,若是客户端浏览器支持Keep-Alive,那么就在HTTP请求头部添加一个Connection:Keep-Alive,当服务器收到附带Connection:Keep-Alive的请求,也会在响应头部添加一个一样的字段来使用Keep-Alive。这样一来,客户端和服务器端之间的TCP链接就会保持,不会断开(超过Keep-Alive规定的时间,意外断电等状况外),当客户端发送另一个到这个服务器的请求仍是会使用这个已经创建的链接。tcp
HTTP/1.1
在HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不一样,默认状况下所在HTTP1.1中全部链接都被保持,除非在请求头或响应头中指明要关闭:Connection: Close这也就是为何Connection: Keep-Alive字段再没有意义的缘由。另外,还添加了一个新的字段Keep-Alive:,由于这个字段并无详细描述用来作什么,可忽略它。
Not reliable(不可靠)
HTTP是一个无状态协议,这意味着每一个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的链接必定是活跃的,在HTTP1.1版本中也如此。惟一能保证的就是当链接被关闭时你能获得一个通知,因此不该该让程序依赖于Keep-Alive的保持链接特性,不然会有意想不到的后果
Keep-Alive和POST
在HTTP1.1细则中规定了在一个POST消息体后面不能有任何字符,还指出了对于某一个特定的浏览器可能并不遵循这个标准(好比在POST消息体的后面放置一个CRLF符)。而据我所知,大部分浏览器在POST消息体后都会自动跟一个CRLF符再发送,如何解决这个问题呢?根据上面的说明在POST请求中禁止使用Keep-Alive,或者由服务器自动忽略这个CRLF,大部分服务器都会自动忽略,可是在未经测试以前是不可能知道一个服务器是否会这样作。
容易犯的误区:
一、HTTP是一个无状态的面向链接的协议,无状态不表明HTTP不能保持TCP链接,更不能表明HTTP使用的是UDP协议(无链接)
二、从HTTP/1.1起,默认都开启了Keep-Alive,保持链接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接
三、Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间
问题现象: 一个JSP页面,竟然要耗时40多秒。网页中有大量的图片的CSS
问题解决: 缘由也找了半天,原来Apache配置里面,把Keep-Alive的开关关闭了。这个是个大问题,工程师为何要关闭它,原来他考虑的太简单了,咱们知道Apache适合处于短链接的请求,处理时间越短,并发数才能上去,原来他是这么考虑,可是没有办法,只能这样了,仍是打开Keep-Alive开关吧。
固然,不是全部的状况都设置KeepAlive为On。
下面的文字总结比较好:
在使用apache的过程当中,KeepAlive属性我一直保持为默认值On,其实,该属性设置为On仍是Off仍是要具体问题具体分析的,在生产环境中的影响仍是蛮大的。
KeepAlive选项到底有什么用处?若是你用过Mysql ,应该知道Mysql的链接属性中有一个与KeepAlive 相似的Persistent Connection,即:长链接(PConnect)。该属性打开的话,可使一次TCP链接为同一用户的屡次请求服务,提升了响应速度。
好比不少网页中图片、CSS、JS、Html都在一台Server上,当用户访问其中的Html网页时,网页中的图片、Css、Js都构成了访问请求,打开KeepAlive 属性能够有效地下降TCP握手的次数(固然浏览器对同一域下同时请求的图片数有限制,减小域名解释的开销),减小httpd进程数,从而下降内存的使用(假定prefork模式)。MaxKeepAliveRequests 和KeepAliveTimeOut 两个属性在KeepAlive =On时起做用,能够控制持久链接的生存时间和最大服务请求数。
不过,上面说的只是一种情形,那就是静态网页居多的状况下,而且网页中的其余请求与网页在同一台Server上。当你的应用动态程序(好比:php )居多,用户访问时由动态程序即时生成html内容,html内容中图片素材和Css、Js等比较少或者散列在其余Server上时,KeepAlive =On反而会下降Apache 的性能。为何呢?
前面提到过,KeepAlive =On时,每次用户访问,打开一个TCP链接,Apache 都会保持该链接一段时间,以便该链接能连续为同一client服务,在KeepAliveTimeOut还没到期而且MaxKeepAliveRequests还没到阈值以前,Apache 必然要有一个httpd进程来维持该链接,httpd进程不是廉价的,他要消耗内存和CPU时间片的。假如当前Apache 每秒响应100个用户访问,KeepAliveTimeOut=5,此时httpd进程数就是100*5=500个(prefork 模式),一个httpd进程消耗5M内存的话,就是500*5M=2500M=2.5G,夸张吧?固然,Apache 与Client只进行了100次TCP链接。若是你的内存够大,系统负载不会过高,若是你的内存小于2.5G,就会用到Swap,频繁的Swap切换会加剧CPU的Load。
如今咱们关掉KeepAlive ,Apache 仍然每秒响应100个用户访问,由于咱们将图片、js、css等分离出去了,每次访问只有1个request,此时httpd的进程数是100*1=100个,使用内存100*5M=500M,此时Apache 与Client也是进行了100次TCP链接。性能却提高了太多。
总结
一、当你的Server内存充足时,KeepAlive =On仍是Off对系统性能影响不大。
二、当你的Server上静态网页(Html、图片、Css、Js)居多时,建议打开KeepAlive 。
三、当你的Server多为动态请求(由于链接数据库,对文件系统访问较多),KeepAlive 关掉,会节省必定的内存,节省的内存正好能够做为文件系统的Cache(vmstat命令中cache一列),下降I/O压力。
PS:当KeepAlive =On时,KeepAliveTimeOut的设置其实也是一个问题,设置的太短,会致使Apache 频繁创建链接,给Cpu形成压力,设置的过长,系统中就会堆积无用的Http链接,消耗掉大量内存,具体设置多少,能够进行不断的调节,因你的网站浏览和服务器配置而异。
减小域名解释的开销对于HTTP/1.0来讲能够充分利用浏览器默认最大并发链接数比HTTP/1.1多的好 处,实现不增长新域名的开销而更高的并行下载,减小域名解释的开销(注:IE 6,7在HTTP/1.0中默认最大并发链接数为4,在HTTP/1.1中默认最大并发链接数为2,IE8都为6,Firefox2在HTTP/1.0中 默认最大并发链接数为2 在HTTP/1.1中默认最大并发链接数为8,firefox 3默认都是6),根据10年7月Google索引的42亿个网页的统计报告,每张网页里包含29.39个图片,7.09个外部脚本,3.22个外部CSS 样式表,若是设置了Keep-Alive而且合理控制Keep-Alive TimeOut这个参数能够大量的节约链接的开销,提升相应速度。若是设置很差,在大并发的状况小,因维持大量链接而使服务器资源耗尽,而对于目前国内大 部分的用户使用的仍是IE6,7的状况下关闭Keep-Alive能够充分利用浏览器默认最大并发链接数的好处实现不增长额外的开销页面快速的展现。