Web Server
http:超文本传输协议,传输超文本文档的(html语言)
在早期html文档都是文本的形式,所以以ASCII码的形式来传输的,但是我们知道计算机是8个位为一个字节,而ASCII只用7个位就能够表示所有的字符,所以在ASCII中最高位永远是0,这也就是为什么一个文件在传输之后会变的大一点原因,这是因为 我们在传输的时候在最高位加了一个0.
而html在传输图片,音乐文件的时候,是以2进制形式传输,不过在早期所有的图片、音乐
也都是要先转换成文本文件才能传输,1Mb的2进制文件---->ASCII(7位有效,最高位为0)
而我们的文本传输8位有效。
http协议: 0.9 ---->1.0(基于TCP80) ---->1.1
我们的http在传输时,是使用文本传输,但是它依靠 MIME来传输2进制SMTP(sample mail tarnsfer protocol ):也是只能传输文本文件,后来为了传输2进制文件,将其做了改变成了MIME (Multipurpose internet mail extension)我们在浏览一些网页的时候会听到音乐,这主要是我们的浏览器以插件的形式来调用本地的音乐播放器,但是这是不安全的,如果对方发来某种形式的文件,能够调用你本地的shell,那岂不危险,所以插件是不能随意安装的。注意我们的浏览器本身是没有播放音乐的功能的,只是你的本机上的音乐播放器被调用的。
我们的一个网页(webpage)往往是有多个页面(object)所组成的,在http 1.0 以后引入了keepalive 保持连接使得我们的多个页面不用每次传输时都进行3次握手,也就是当第一个页面3次握手之后不是立刻断开连接,而是准许后续的页面来进行tcp的连接,一般来说我们通常会定义仅准许N个用户keepalive,而后面的用户让其等待并告诉他说服务器繁忙,所以对于非keepalive的用户,一旦自己断掉,后面的用户就会很容易的挤进来,而对于keepalive的用户来说他就会一直在一段时间内占用服务器的资源,这样往往会导致服务器的负载能力的下降,所以也是有一个值大概5秒的时间内是对用户进行保护连接的。所以说我们是否保持连接,是看我们的情况的,也就是说我们不会一直保持连接(防止空闲连接的占用资源),也不会让每个用户在访问每一个页面的时候都需要3次握手重新进行连接。但是有一种情况:如果一个连接在接上之后一直传输文件,这也是不好的(所以定义了一个参数来规定一次keepalive所能传输的文件个数,也就是说即便你没有超出5秒钟,但是传输的文件超过了要求的个数,就会立刻断掉连接,让其重新排队),所以在高压,高并发的服务器上一般关闭keepalive。
在CS 模式的web中。每一个用户的一个连接都是要使用一个独立的进程来响应在我们的web服务中使用apache (现在已经成为ASF基金会http://www.netcraft.com)全球60%的网络服务使用 httpd 在httpd ,中有一个MPM(multi processing module)多道进程模块,是专门来处理服务器与用户间的连接控制的。MPM对用户的连接控制有两种 1。是基于进程的 2.是基于线程的process 在基于进程模式中,b1 b2对相同网页的连接请求会打开两个不同的进程,这使的一个用户的进程的毁坏不会影响到其他用户的使用,注意一般我们apache中的MPM是基于进程的形式来对每一个用户的请求作出响应的,但是进程占用服务器的资源比较高,所以就出现了一种基于线程的模式来问多用户的访问提供响应,thread,使用线程的模式(我们知道进程是分配资源的单位,进程是有多个线程组成的,并且这些线程共享同一个进程的资源(打开的文件文件句柄、进程号、cpu时间片等)),也就是说多个用户b1 b2同时访问一个网页的时候,如果是基于进程实现,即便b1 b2访问的是同一个页面index.html,这个index.html也会在内存中被打开两次并且赋予给b1 b2不同的进程,如果我们是基于线程的话,我们只需要一个进程打开一次index.html文件,b1 b2则分别是打开index.html进程的线程,所以文件在内存中只需打开一次,且只有一个进程,并且关闭进程的时间也就缩短了,不过有一个问题,假如b1所在的线程崩溃了,或b1这个用户修改index.html文件,b2用户也是会受到影响的,基于线程的会大大的提高服务器的并发能力。所以说,我们的服务器是基于线程的还是基于进程的,主要看我们在搭建服务器的时候是看重并发能还是稳定性。
MPM: 包含有两种模块 面试很重要
prefork 完全基于进程的模式来进行会话,每一个会话都会基于一个独立的进程来响应的
一般来讲,当我们的http启动的时候,启动一个httpd进程,
1. 这是一个父进程专门为当用户建立会话的时候生成新的httpd的进程,
2. 并当用户访问进程结束的时候回收其资源
worker 完全基于线程的模式来进行会话
很可能会启动2个或者多个父httpd的进程,每一个httpd进程的多个线程对多个用户的请求进行分配,这样:
1。实现负载均衡,也就是每个进程都可以将其线程分配给用户请求响应,提高响应的速度
2. 可以防止一个进程崩溃、毁坏导致所有用户的崩溃
但是在我们的linux主机是基于进程控制的,也就是说线程和进程没有太大的区别它的线程不是真的线程,线程的实现并不明显,所以在linux的服务器上prefork和worker的性能区别不大,所以在我们的linux主机上多使用prefork ,但是对于原生就能很好支持线程的操作系统solarus或windows,在上面worker比prefork强很多!
URL:统一资源定位符,就是用来定义从很多的网页页面中选取某个特定的页面
protocol://FQDN/path/to/file
eg: http://www.isc.org/index.html
http协议有8种动作对指定资源不同操作的方式:这里讲写主要的
OPTIONS(测试服务器的功能性的请求)
HEAD (每次向服务器发起请求,只显示协议响应本身,不下载index数据, ]#curl -I http://www.sohu.com 在这个命令的显示信息中有一个FSS-Cache,叫做缓存命中 ,这说明我们获取的www.sohu.com的资源不是从主机过来的,而是从同你在一个区域内的服务器上获得的,也就是说sohu已经将数据缓存到你家门口了,你访问的是一个sohu的缓存服务器,这样加快访问速度,所以说构建一个高并发的服务是很复杂的,需要用到智能DNS,缓存啊,等等)
GET(向对方服务器发起请求,并将数据下载下来)
POST(我们提交的表单数据会被Server处理的,但是服务器为了安全必须对提交的数据进行安全检查)
PUT(向远程服务器上传网页数据用的,这很危险和ftp的put一样,所以在网络中一般禁用)
CONNECT(能够将连接改为管道方式的代理服务器)
DELETE(删除指定的资源)
TRACE(回显服务器受到的请求)
所以通过上面的方法,我们在架站的时候可以定用户可以使用什么样的请求,这样也可以加强安全
注意:http仅仅是一种web协议
web server software
apache httpd
sun sws(sun web server)
nginx 后起之秀,站在前人的肩膀上,对于静态网页响应的非常的快
但是在动态网页方面就不太好了(因为这个速度是取决于后台处理器的速度)。所以在web服务中nginx一般做前端以非常小的内存提供很强大的高并发web服务,有人做过实验4G内存apache最多提供3000用户的同时连接,而同样条件的nginx能够实现30000个同时连接。 但是apache还是比较强的,现在2011年11月份打开占到市场65%而nginx占到8.5%,在国内qq 、腾讯的前端好像是nginx的
microsoft IIS IDC领域用到的多
NCSA 美国高性能计算 1999年解散,但是之前研发出来的一款产品就是apache的前身,所以在加上个样的补丁就成了今天的apache
google GWS
lighttpd 德国的据说和nginx差不多,据说性能相当的好
但是这些都是纯粹的html服务器,只是解析.html文档的软件
Order allow,deny Order表示次序的意思,先allow后deny,放在后面的是默认法则,allow 是准许下面定义的allow from 192.168.0.0/24网段中的主机(所有的)来访问,而其他的决绝访问
Allow from 192.168.0.0/24 这样就实现了基于ip地址的访问控制