首页 > 代码库 > web服务器架构

web服务器架构

基础知识普及:

http: HyperText Transfer Protocol: 超文本传输协议

它不仅能够保证计算机快速地传输超文本文档,还能确定传输文档中的哪一部分,以及哪部分内容先显示(如文本先于图形)等。

http协议是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

能够在文档中实现跳转的协议;


web:能够让所有人实现http协议,使用的版本是0.9的版本;

http/0.9:仅支持纯文本(超级链接)格式,ASCII;

HTML:编写超文本的语言;HYPER TEXT Mark Language;

用户通过客户端浏览器进行浏览的时候能够变成固定的格式。

Browser(浏览器):客户端


资源:

比如:

1.1.1.1:服务器上面提供一个web页面,叫做a.html;

2.2.2.2: 服务器上面也提供一个web页面,也叫做a.html;

但是仅仅依靠文档名,是无法让用户识别不同的文档的。


于是出现了:

URI:Unifom Resource  Indentifier;在互联网上可以在全局唯一引用某一个服务的方式;统一资源定位符。

统一:路径格式上的统一;叫做统一资源标识符;统一资源标识符有一个子对象叫做URL。统一资源定位符。

URL:统一资资源定位符。


protocol://HOST:port/path/to/file


http://www.zledu.com/download/linux.tar.gz说明:协议名字:主机名;路径



资源:每一个图片都是一个资源;

而多个资源很可能被整合为一个html文档;

web对象与web资源是同一个概念。


资源访问的方法:HTTP方法;可以跨越不同的主机,对资源进行整合,然后在同一个页面进行展示。

既然页面是有资源组成的,那么我们访问服务器的时候,如何获取服务器上的资源?目前我们既可以将本地的数据

传到远端,也可以将远端的显示到当前页面。因此资源获取的方式不同。我们称为http方法。


http;0.9版本的时候只有这一种方法叫做GET;获取远端服务器的资源到本地。通过浏览器进行显示。

http协议1.0的方法有如下几种:PUT,POST,DELETE;

put:修改服务器上面的内容;

POST:向指定的资源提交要被处理的数据;通过表单进行处理。

GET:请求获取Request-URI所标识的资源;从指定的资源请求数据;直接从服务器上获取资源到本地;

DELETE:请求服务器删除Request-URI

http协议一共有8种方法,最常用的方法就上面几种方法类型。



MIME:Multipurpose Internet Mail Extension,多用途互联网邮件扩展。将非文本数据在传输前重新编码为文本格式,

接收方能够用相反的方式将其重新还原为原来的格式,还能够调用相应的程序来打开此文件。

SMTP: Simple Mail Transmission Protocol, 纯文本 早期传输邮件只能传输纯文本的数据。


http协议将mime协议引入到其中,导致现在浏览器能够获得各种各样的数据。浏览器以插件的形式来解析mime传输的各种文档的。如pdf。


动态网页:正是由于插件的出现,出现了动态网页。


动态网页:服务器端存储的文档是非html格式,而是编程语言开发的脚本。脚本接受参数之后在服务器运行一次,

运行完成之后会生成HTML格式的文档,把生成的文档发给客户端;这样一来服务器端就需要运行解释器,

服务器端承受的压力就会比较大。


web服务器不能够帮我们执行这些脚本?web服务器不能帮我们执行这些脚本web服务器需要借助额外的工具来实现。

 

web服务器常见的有APACHE,NGIX,LIGHTTPD,TOMCAT。


如:asp,php。结尾的。web服务器会根据某种协议去调用php的解释器,让其运行index.php的脚本。将生成的文档再通过协议返回给

web服务器。web服务器再返回给客户端。web服务器只是一个http服务器。


详细讲解用户访问web服务器的整个过程?

简单点访问原理:客户端用户发送一个http请求,http请求到达服务器之后。先进入服务器的内核空间,服务器的内核空间,将其进行解析。

发现其实一个web请求。然后将其给本机的用户进程http进程。http进程再发送一个请求,到内核空间,内核空间将我们

要访问的数据从硬盘上提取出来。返回给我们的用户空间进程。用户空间进程再将其内容发送给内核空间。

内核空间经过层层转换发送给客户端。




复杂点访问原理:客户端用户发送一个http请求,http请求到达服务器之后。先进入服务器的内核空间,服务器的内核空间,将其进行解析。

发现其实一个web请求。然后将其给本机的用户进程http进程。http进程发现其要访问的是动态网页,通过其他协议,

首先调用动态网页的程序即动态网页解释器再将内容给送到内核空间,内核空间将我们要访问的数据从硬盘上提取出来进行处理。返回给我们的

   用户空间的的解释器进程。解释器进程再将生成的文档再通过协议返回给web用户进程。web服务器再将其发送给我们的内核

。内核空间经过层层转换发送给客户端。


一个用户访问我们需要开启一个进程,1万个用户过来访问就需要开启更多的进程。这个时候就需要更多的系统资源。



动态网页:包含静态的内容和动态内容。当动态程序运行完之后,一并返回给客户端。


http协议1.0之后,这些都能够满足这些需要了。当然1.0当中我们也引入了缓存的机制。

从纯静态页面来讲:

www.zledu.com         首先使用dns将FQDN解析成IP地址;然后再去访问这个主机。服务器端接受请求之后。

两种方式:阻塞:一直处于等待状态;

  非阻塞:需要过一段时间,过来进行请求访问。轮询模式;

 

IP首部:

Source IP   

Destination IP

TCP

Source   port

Destination Port

HTTP首部:明确定义我要基于这个主机访问那些资源;

GET/2.HTML

    HOST:wwwzledu.com(虚拟主机)


HTTP格式的报文:请求报文,响应报文。


请求报文语法:

<method>#资源获取方法 <request-URL>#您请求的资源是什么; <version> #对应请求协议的版本号;

<headers>#http协议首部;

#空白行是必须的;

<entity-body> #报文主体;


响应报文语法:

<version>#对应的协议版本 <status>#状态码,标明存在的结果是否正确;<reason-phrase>#具体解释原因       ###请求行

<headers>#告诉客户端,服务器端的MIME类型             ###报文首部

####空白行必须的

<entity-body> #####报文主体


状态码分类:

1xx:纯信息,很少用;

2xx:“成功类”的信息;(200,201...)

3xx: 重定向类的信息;(301,302,304...)

4xx: 客户端错误类的信息;(404,服务器端不存在...)

5xx: 服务器端错误类信息;(500,501....)



例如:

请求报文:

GET / HTTP/1.1          #GET后面什么都没有,默认获得对方的主页面信息;

Host: www.zldu.com      #

Connection: keep-alive

 

响应报文:

HTTP/1.1 200 OK   #对应的协议版本,状态码;后接reason-phrase。

X-Powered-By: PHP/5.2.17#header内容

Vary: Accept-Encoding,Cookie,User-Agent#

Cache-Control: max-age=3, must-revalidate#

Content-Encoding: gzip#内容编码机制

Content-Length: 6931#内容格式的长度



上面两个报文的第一行通常称作报文“起始行(start line)”;后面的标签格式的内容称作首部域(Header field),

每个首部域都由名称(name)和值(value)组成,中间用逗号分隔。

另外,响应报文通常还有一个称作Body的信息主体,即响应给客户端的内容。



web服务器的主要操作有哪些:

1、 建立连接——接受或拒绝客户端连接请求;

2、 接收请求——通过网络读取HTTP请求报文;

3、 处理请求——解析请求报文并做出相应的动作;

4、 访问资源——访问请求报文中相关的资源;

5、 构建响应——使用正确的首部生成HTTP响应报文;

6、 发送响应——向客户端发送生成的响应报文;

7、 记录日志——当已经完成的HTTP事务记录进日志文件;



综上所述,要开发一个web服务器也是很简单的,只需要能够解码协议,响应请求,访问资源,构建报文,记录日志即可。


那么缓存到底是干什么的?

想象这样一种场景:我们需要获取这样的一个网页内容:10张image,3个css样式,5个htmls。那么这个网页包含了18个请求;

这18个请求是一个一个请求的,还是一块请求的。注意:每一个资源都是单独请求,单独传输的。那么我打开一个web页面就要

发送n次请求(因为每一个资源都要单独请求)。当我们打开一个比较慢的网站的时候,都是先有文字,后出现图片的。其实图片

内容太大了,发送的比较慢些。因此为了让客户端打开我们的网站速度快点,我们的浏览器多数都是多线程的。比如IE6是4线程的。

google浏览器是2个线程的。这样每个线程发送一个请求,多个资源同时往本地拉取。这样看着网页的速度会稍微快点。



http协议是基于tcp的协议。三次握手,四次断开。

这样的话服务器端的压力非常大,因此就需要缓存机制。清理垃圾就会将我们的流量给增大了。

http1.0里面引入的机制就有缓存的机制。

http1.1版本:

增强了缓存的功能;

引入了长连接的机制。(表示客户端与服务器之间获取一个资源之后,不断开,继续获取第二个资源等等)。

大多数情况下,使用长连接能够大大的提高服务器的性能。

设定长连接的超时时间。



Web服务器处理并发连接请求的架构方式:

1、单线程web服务器(Single-threaded web servers)(单进程)


此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,

因此,在并发请求较多的场景中将会出现严重的问题。




2、多进程/多线程web服务器


此种架构方式中,平时有一个服务器进程工作着,自己不响应,生成一个子进程。

web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。

有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,优点就是稳定性还可以。早期

大量的服务器使用的是这个类型的架构方式。不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或

线程将会消耗大量的系统资源。




3、I/O多路复用web服务器(这种机制是,自己一个人负责多个用户的请求。如何完成的呢?一个进程来完成多个用户的响应请求,这个进程只负责将用户请求,接进来。

采用轮询的状态检查机制,每隔固定时间挨个进行查询响应的具体情况即可。当发现某一个完成了,将其响应给固定的客户即可。

效果也不太好。优化下就成了事件处理机制型的。每个客户响应都有一个状态码,只查看状态码即可。但是也需要扫描一遍,这样开销也挺大的。第三种就是

当状态发生变化之后,主动通知我,自己管理自己。这样就可以一个进程处理多个请求,而且每一个请求都有自己的状态,而且这个请求还可以向我发送通知。发送

通知的方法有两种:水平触发和边缘触发。水平触发是只通知一次,无论你是否进行处理。这个呢,类似于你在逛大卖场,你在某家店预订了一碗饭,饭好之后,在大屏幕

滚动播出一次。边缘触发是定期发送通知,直到该进程进行处理边不发送。但这两种都不太好,又引入了第三中触发机制,直接发送通知到进程本身。类似于短信通知)


为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多路复用的架构——同步监控所有的连接请求的活动状态,

当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新

变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲

的连接所占用,因而可以提供高效的工作模式。但是如果这个进程服务于过多的用户,多个用户同时通知进程我已经好了,进程响应用户的请求还是会吃紧。



4、多路复用多线程web服务器(有一个进程叫做master进程,不响应任何的请求工作。只负责将响应接进来。分配给自己管理的进程,

交给一个自己复制的进程,自己用来管理,将用户请求,分给哪一个进程,每一个进程可以接受多个用户请求。一个进程处理固定数目的用户请求,

当请求数目多的时候,复制多个进程。请求不多的时候,销毁多余的进程,留下几个进程即可。)


将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。




总结:

web服务器是C/S架构的模型或者B/S架构:

C(CLIENT)(客户端代理程序,BROWSER(浏览器),spider(蜘蛛))

client--》request-->server

URL

S(Server):

server-->response--->client


http method:get,head,post,put,delete,trace,options,connect.最常用的方法是前三种。

http headers(http首部类别非常多):

Name:VALUES

host:www.zledu.com

connection:keep-alive;

httpd软件:提供的模型有prefork,work,event。三种模型对应上面不同的架构方式。


http客户端类型:IE,FIREFOX,CHROME,OPERA,SAFARI...

服务器端类型:APACHE,IIS,ngix,lighttpd,thttpd....


应用程序服务器:这种服务器不但能够处理静态内容,还能够处理某种特定格式的动态内容。常用的有:IIS,TOMCAT(支持解析java)开源的、Websphere(IBM,jsp)商业产品。

weblogic(Oracle,JSP,commodity);JBOSS(REDHAT):核心是一个tomcat,都可以提供web服务器。


www.netcraft.com这里可以查看最近的全球互联网上web服务器所占的比例。

发现ngix是所有服务器里面做反向代理最牛的。之后的文章我将围绕ngix进行展开普及。



代理


Web代理服务器工作于web客户端和web服务器之间,它负责接收来自于客户端的http请求,并将其转发至对应的服务;而后接收来自于服务端的响应,并将响应报文回送至客户端。






本文出自 “汗水成就梦想” 博客,请务必保留此出处http://redhatdragon.blog.51cto.com/9183870/1441261

web服务器架构