本篇文章是为了详细理解apache服务器的优化而编写的基础文章。这里主要讲解他们之间的关系。如果您想理解apache的并发的概念可以查看上一篇文章从工作模式讲解apache进程和用户请求的关系。如果您想理解apache和浏览器连接相关内容您可以查看浏览器与apache通讯中的TCP连接状态迁移。
并发(并发数量):就是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文件。找了半天发现只有下这一段跟最大连接数有点关系。
对于上图的参数不明白可以查看上一篇文章从工作模式讲解apache进程和用户请求的关系。
按照如上图一样设置后进行测试。
参数:
StartServers
1
MinSpareServers
1
MaxSpareServers
2
ServerLimit
256
MaxClients
3
MaxRequestPerChild
4000
测试环境:
服务器
虚拟机上的centOS4.5
客户端
本机上的IE浏览器
服务器地址
192.168.212.128
客户端地址
192.168.212.1
访问文件
for($i = 0;$i <= 10;$i++){echo date('H:i:s',time());echo '
';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的ClientMax等参数控制的。
补充
这篇文章是本人对apache和浏览器之间的请求,连接,并发的个人观念。难免会有错误。
本文地址:http://www.qindamoni.net/114