并发(并发数量):就是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等参数控制的。