博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache与浏览器之间的并发,连接,请求
阅读量:5864 次
发布时间:2019-06-19

本文共 3274 字,大约阅读时间需要 10 分钟。

  hot3.png

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

转载于:https://my.oschina.net/shyl/blog/690038

你可能感兴趣的文章
selenium-2 使用xpath定位元素
查看>>
Java工具类——UUIDUtils
查看>>
使用Node搭建reactSSR服务端渲染架构
查看>>
文件缓存
查看>>
生成固定大小的占位图片
查看>>
作业五 :团队项目准备素材搜集
查看>>
转 博弈类题目小结(hdu,poj,zoj)
查看>>
Java NIO学习笔记八 Pipe
查看>>
远程协助
查看>>
Scrum实施日记 - 一切从零开始
查看>>
关于存储过程实例
查看>>
最简单删除SQL Server中所有数据的方法
查看>>
闲话缓存:ZFS 读缓存深入研究-ARC(二)
查看>>
PLSQL_PLSQL中DML/DDL/DCL的概念和区分(概念)
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
super.getClass()方法调用
查看>>
黑客视频(超级牛人)
查看>>
常用的谓词和逻辑运算符
查看>>
开发者可以调用微信小店货架上的商品了
查看>>
Myeclipse7.5 下载 安装 注冊 注冊码 100%成功
查看>>