文档章节

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

stone_
 stone_
发布于 2016/06/12 17:19
字数 2122
阅读 220
收藏 3

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

本文转载自:

stone_
粉丝 21
博文 221
码字总数 163611
作品 0
洛阳
程序员
私信 提问
apache 的工作模式

apache有几种工作模式?怎么查看和修改apache的工作模式? apache的工作模式有:beos,event,worker,prefork,mpmt_os2。 在linux(centos)下使用#http –l 命令可以查看当前使用的工作模...

旋转木马-千里马
2016/01/08
73
0
高并发Web服务的演变——节约系统内存和CPU

【导读】 徐汉彬,现任腾讯SNG增值产品部高级工程师,QQ会员AMS运营平台技术负责人(CGI高峰日请求5亿+),曾就职于阿里巴巴、小满科技。主要专注于Web系统的研发和架构设计工作,在大规模W...

丈量大地
2015/11/12
27
0
http协议之初识

一、概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏...

ericSM
2015/11/26
77
2
Apache的三种MPM模式比较:prefork,worker,event

就最新版本的Web服务器Apache(版本是Apache 2.4.10,发布于2014年7月21日)来说,一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。它们分别是prefork,worker和event...

stone_ryan
2016/03/05
0
0
PHP数据库长连接mysql_pconnect的细节

PHP的MySQL持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之。这到底是为啥么。近距离观察后发现,这家伙也不容易啊,要看Apache的脸色,还得听MySQL指挥。 对于作为Apache模块运...

rick009
2012/12/12
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

【TencentOS tiny】深度源码分析(4)——消息队列

消息队列 在前一篇文章中【TencentOS tiny学习】源码分析(3)——队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的,那么我们今天来看看消息...

杰杰1号
4分钟前
1
0
Hive

这就是那个 JAVA 类 package cn.itcast.bigdata;import java.util.HashMap;import org.apache.hadoop.hive.ql.exec.UDF;public class PhoneNbrToArea extends UDF{privat......

Garphy
4分钟前
1
0
Springboot开发,第二天

SpringBoot学习,第二天 目录:1、Springboot整合Listener 2、Springboot访问静态资源 3、异常处理 4、热部署 一、SpringBoot整合Listener 两种方式完成组件的注册 1、通过注解扫描完成组件的...

有一个小阿飞
8分钟前
2
0
BeginnersBook Perl 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
20分钟前
2
0
我的Java秋招面经大合集

阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 然后我...

Java技术江湖
25分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部