HTTP连接管理我们大体会谈到如下内容:串行连接,并行连接,持久连接以及管道化连接。现在流行的浏览器如chrome,firefox都采用了并行的持久连接来提升性能,减少加载延时。本文只针对HTTP/1.0和HTTP/1.1,HTTP/2不在讨论范围。
Keep-Alive
方式使用非常广泛,虽然在HTTP/1.1中已经不再使用。使用
Keep-Alive
有一些需要注意的地方:
Keep-Alive
默认并不会启用。客户端必须发送一个Connection:Keep-Alive请求头部来激活Keep-Alive连接。
Connection:Keep-Alive
Keep-Alive:timeout=1800, max=5
表示服务器最多还能为5个HTTP事务保持持久连接,Keep-Alive的超时时间为1800秒。在Apache中对应配置如下:
# KeepAlive: Whether or not to allow persistent connections (more than
KeepAlive On
# MaxKeepAliveRequests: The maximum number of requests to allow
MaxKeepAliveRequests 5
# KeepAliveTimeout: Number of seconds to wait for the next request from the
KeepAliveTimeout 1800
Connection:Keep-Alive
必须随每个希望保持持久连接的请求的头部发送,如果某个请求没有带Keep-Alive头部,则服务器会在
Connection:close
即可。#apache2.conf
KeepAliveTimeout 1800 #一般设置5秒以内即可,以减少内存浪费。
KeepAlive On
MaxKeepAliveRequests 2 #设置
#mpm_prefork.conf
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves
StartServers 1
MinSpareServers 1
MaxSpareServers 1
MaxRequestWorkers 1
MaxConnectionsPerChild 2
这里我们开启KeepAlive,然后设置最多保持的请求数为2个(加上初始的请求,一个连接可以最多发送3个请求),KeepAlive
超时为1800秒。注意下prefork的配置,为了方便测试,我们设置apache子进程数为1,注意这里的MaxConnectionPerChild,
设置的是2,这是什么意思呢,apache的prefork模式下,可以指定一个子进程最多处理的请求数,到了数目则杀掉这个子进程,
重新创建一个子进程,以防止内存泄露。
开启Keep-Alive的优点是可以加快网页加载速度,减少频繁建立连接来降低CPU的使用率。缺点是会多占用内存,所以如果
开启KeepAlive,那么KeepAliveTimeout不能设置太大,以免持久连接太多耗光服务器资源。至于线上环境是否开启,视情况而定
,如果服务器内存很大配置很高,开不开启没多少影响,如果内存较小,则建议关闭节省内存。
要注意的地方来了,开启KeepAlive后,MaxConnectionPerChild的这里的请求数怎么算呢?一个持久连接的两次请求在apache
这里算一个请求还是两个呢?答案是1个,也就是一个持久连接的多次请求在apache的子进程这里只是同1个连接,也就是说,在
我们这样的设置下,只要间隔没有超过1800秒发起请求,前3个请求会共用一个持久连接。
使用chrome(版本55.0.2883.95)
发送一个请求,我们可以看到请求头和响应头如下(不同浏览器头部可能有所不同,请自行查证):
Connection:Keep-Alive
,响应头部会带上
Connection:Keep-Alive;Keep-Alive:timeout=1800,max=2
,表示服务器支持Keep-Alive,且持久连接最大请求数为2,超时时间为1800秒。接下来继续发送2个请求,可以看到响应头分别带
Connection:Keep-Alive; Keep-Alive:timeout=1800, max=1
和Connection:close
Connection:close
,
watch -n 1 "ps aux|grep apache|grep -v grep"
。