Apache与浏览器之间的并发,连接,请求

并发(并发数量):就是apache的并发数量,更直接就是apache为了处理用户请求开启的进程数量,简单理解就是apache的进程数量。
连接(TCP连接):apache和浏览器之间是通过TCP/IP协议进行通信的,这里的连接就是apache和浏览器之间的TCP连接。
请求(浏览器的请求):apache服务器一直监听80端口,不会发起主动请求。而浏览器会向apache发起连接请求。这里讲的请求就是浏览器的请求。

一个浏览器能发起几个请求?是什么限制浏览器发起请求?
答案:无数,如果用户的电脑配置允许。
这个应该是废话,浏览器在客户端,用户想发几个就发几个请求。限制条件应该是用户的电脑配置吧。一般一台电脑开几百个浏览器对同一个网站发请求应该是没有问题。

是不是每个浏览器的请求都能够建立连接?是什么限制了浏览器和apache的连接数?
答案:不是所有请求都会建立连接,限制是linux操作系统上,或者说apache所在的操作系统。
既然浏览器可以发起无数个请求,那么能不能成功建立连接就是服务端的事情。那么到底是apache限制了最大的连接数还是linux限制了最大的连接数?还是PHP限制了最大连接数?或者说是mysql限制了最大连接数?
答案:linux限制了浏览器和apache之间的最大连接数。下面就通具体的测试来回答。
首先我们假设是apache限制了最大连接数。打开apache的httpd.conf文件。找了半天发现只有下这一段跟最大连接数有点关系。
参数:

StartServers 1
MinSpareServers 1
MaxSpareServers 2
ServerLimit 256
MaxClients 3
MaxRequestPerChild 4000

测试环境:
服务器
虚拟机上的centOS4.5
客户端
本机上的IE浏览器
服务器地址
192.168.212.128
客户端地址
192.168.212.1

访问文件

<?php
for($i = 0;$i <= 10;$i++){
    echo date('H:i:s',time());
    echo '<br/>';
    sleep(10);
}
?>

通过10个IE浏览器模拟10个用户同时对apache发起请求:(基本同时访问)
通过netstat命令可以看到这10个请求都建立了连接。
#netstat -nt|grep –i '80'
再看看apache的情况:
#ps –U apache u

第一次同时访问时候apache只启用了3个进程处理前三个用户的请求。

过10*10秒之后再看看连服务器的连接状态和apache进程状态。

可以看到第一批3个用户的请求处理完毕,3个连接状态为TIME_WAIT。
可以从前面的IE浏览器打印的内容看到最后的响应时间为18:20:35。
要知道这个时候另外7个页面还是在载入中。可以看到这7个浏览器的进度条在走,而不是没有响应,也没有提示403等错误。

看到apache的进程还是只有3个,因为上面的MaxClients=3限制了最大的进程数为3。而不会开启多余的进程处理请求。

再看看过了2*10*10秒后的状态。

可以看到第一批3个用户的连接已经断开,第二批3个用户的请求已经处理完毕,
正在准备断开连接,TIME_WAIT会在2*SML秒后进入 CLOSED状态。即断开连接。
可以从前面IE浏览器打印的内容看到开始响应时间为18:20:52。最后响应时间为18:22:32。
第一批和第二批浏览器已经显示完毕,剩下的4个浏览器状态是正在载入中,可以看到进度条在走动。

看到apache的进程还是只有3个。

再看看过了3*10*10秒后的状态。

可以看到这时前面的6个连接都已经断开,第三批浏览器的请求已经处理完毕正在准备断开连接,
TIME_WAIT会在2*SML秒后进入CLOSED 状态。即断开连接。
可以从前面IE浏览器打印的内容看到开始响应时间为18:22:42。最后响应时间为18:24:22。
第一批,第二批,第三批浏览器已经显示完毕,剩下的1个浏览器状态是正在载入中,可以看到进度条在走动。

看到apache的进程还是只有3个。

再看看过了4*10*10秒后的状态。

可以看到这时前面的9个连接都已经断开,第四批浏览器的请求已经处理完毕正在准备断开连接,
TIME_WAIT会在2*SML秒后进入CLOSED 状态。即断开连接。
可以从前面IE浏览器打印的内容看到开始响应时间为18:24:25。最后响应时间为18:26:05。
第一批,第二批,第三批,第四批浏览器全部显示完毕。

可以看到apache的进程已经减少为2个。

测试得到的结论
上面的测试可以看到,浏览器与apache之间的最大TCP连接数不是有apache限制的。
apache工作模式中MaxClients等参数只是限制了apache的进程数量,并没有限制浏览器和apache的连接数量。
就算apache的进程已经到达MaxClients的最大数,其他浏览器还是可以访问。
而且访问也不会拒绝,只是在等待apache的进程将前面的请求处理完,再处理这些没有响应的请求。

为什么apache不能限制最大的TCP连接数呢?
答案:TCP连接是在链路层,apache是基于http协议的在应用层。

下面看看linux是怎么限制TCP连接的最大数的。
首先使用sysctl -a命令看看linux下面的系统配置参数。
#sysctl –a

看到这么多系统配置参数,是不是有个参数可以控制TCP的最大连接数呢?

找了很久,没有发现可以直接控制TCP最大连接数的参数,
每个连接成立以后linux都会对其进行维护(并且创建维护文件,linux的防火墙就是根据这个文件的)。
发现有个参数ip_conntrack_max就是这个维护文件最大数。(可以使用modprobe ip_conntrack开始这个参数。
可以使用#less /proc/net/ip_conntrack|wc –l 查看当前已经建立的该文件数,连接断开后这个文件也会关闭)
#sysctl -a|grep ip_conntrack_max

虽然看到两个,但是这两个文件是同步的,修改后会自动同步。
我们把它的值修改为1,虽然有点极端,但是可以很好解释为很么是linux限制了浏览器的最大TCP连接数。
#echo 1 > ip_conntrack_max

使用两个IE浏览模拟2个用户同时访问apache。使用netstat命令查看。
#netstat -nt|grep –i '80'

看到问题了吧。只有一个连接,第二个访问的浏览根本就没有反应。

测试得到的结论
在我们把ip_conntrack_max设置为1的时候,浏览器不管发送多少请求,linux只会和它建立一个连接。
那么linux没有专门的值来控制TCP连接的最大数呢?有,只不是linux把个限制的条件细化了。
比如:同时可以建立多少CLOSE_WAIT 状态的连接数,同时可以建立多少个TIME_WAIT状态的连接数,等等等。
所以想要控制apache的最大连接数,需要通过配合这些数据进行组合。

总结
如果认真读完上面的内容,会的到下面的结论。
1.用户的浏览器可以对apache发起N个请求。N的数值可能会很大。
2.只有M(M小于N)个请求会跟apache建立连接(只是建立连接,并不是处理)。
  而这个M的值是由linux服务器控制。linux会根据硬件的情况会给出默认值。
  我们可以通过各个参数的组合来计算最后的TCP连接数的最大限制。
3.只有P(P小于M)个连接会得到apache的处理。apache会建立P个进程处理这P个连接。
  这个P的值是apache的MaxClients等参数控制的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章