1、Web/HTTP服务器和客户端
1)Web/HTTP服务器
Web内容都是存储在Web服务器上的。Web服务器使用HTTP协议,因此经常被称为HTTP服务器。以下简单介绍两种HTTP服务器:
(1)Apache:目前世界上最广泛使用的HTTP服务器软件。
安装:sudo apt-get install apache2
启动:通常地,apache2不能直接启动,而是借助于其他工具,如sudo service apache2 start或sudo apache2ctl start或sudo /etc/init.d/apache2 start。
ps的结果显示,以root启动了一个进程(父进程,默认绑定80端口),以www-data用户启动了两个子进程(可以用ps -eLf观察到一大堆“线程”,图略):
在浏览器输入localhost:80可以访问服务器的主页(默认是/var/www/html/index.html的内容)。也可以用telnet localhost 80与服务器交互。
特性:开源、功能强大、灵活,可以在很多平台与环境中工作。
不同的平台和环境往往需要不同的特性,或以不同的方式来实现效率的最大化。Apache通过模块化的设计适应各种环境。通过在编译或运行时指定哪些模块加载到服务器中,来选择服务器的特性。使用apache2 -l输出编译到服务器中的模块列表(不包括使用LoadModule配置项指定的动态加载的模块):
如图,从*-enabled目录我们可以获得当前正在使用的模块和配置等信息,它们都链接到*-available/中相应的文件:
以下介绍其中的一些模块:
I、Apache 2.0扩展此模块化设计到最基本的Web服务器功能。它提供了可以选择的多处理模块(Multi-Processing Module,MPM),用来绑定到网络端口上,接受请求,以及调度子进程处理请求。
不同系统的默认MPM可能不同,如Windows是mpm_winnt,而Unix是prefork、worker或event,取决于平台特性。
MPM很像其他Apache模块。主要区别是,在任何时间,有且只有一个MPM模块加载到服务器中。
将MPM编译成动态模块之后,可以通过LoadModule配置项选择具体的MPM模块,而不用重新编译服务器程序。
主要的MPM模块有:
- mpm_worker_module(worker):实现了一个混合的多进程多线程Web服务器。与基于进程的服务器相比,它通过线程来处理大量请求时,可以消耗更少的系统资源。另外,多进程的设计也在很大程度上保证了和基于进程的服务器一样的稳定性。对扩展性要求更高的站点可以选择使用线程的MPM,即worker或event(见下文)。一个父进程负责发起多个子进程。每个子进程创建ThreadsPerChild个worker线程,还有一个监听线程,它监听连接请求,并把连接传递给worker线程。Apache维护一个空闲worker线程的池。它会评估所有进程中空闲线程的总数,并通过fork或kill进程,使这个总数保持在MinSpareThreads和MaxSpareThreads范围内。其他配置项:StartServers(指定开始时启动的子进程数)、MaxClients(指定可启动线程的最大总数)等。
- mpm_prefork_module(prefork):实现了一个无线程、预分支(pre-forking)的Web服务器。它适用于那些对可靠性要求较高或需要避免使用线程以兼容非线程安全库的站点。一个父进程负责发起子进程,而子进程监听连接并处理请求。Apache总是维护着几个空闲的子进程。
- mpm_event_module(event):worker的一个试验性变体。
II、log_config_module(mod_log_config):负责记录(logging)发往服务器的请求的模块。
III、so_module(mod_so):负责在启动或重启时加载可执行代码和模块到服务器的模块。
(2)nginx(engine X):小巧高效可扩展的HTTP/反向代理/邮件代理服务器。
安装:sudo apt-get install nginx-full
启动:sudo nginx
可见,nginx以root启动了master进程(其PID写在/run/nginx.pid),以www-data启动了4个worker进程。另外,master进程在80端口上监听。这些配置可以在/etc/nginx/nginx.conf中指定。
访问:http://localhost:80
选项:-V:显示版本和配置选项;-c conf:指定配置文件;-t:测试配置文件;-s signal:给master进程发送“信号”,以控制nginx的行为。各个“信号”的含义如下:
stop:快速关闭;quit:“优雅地”关闭,会等待worker进程完成对当前请求的响应(相当于kill -s QUIT);reload:重新加载已修改的配置文件。若成功(配置文件语法没问题),master进程会开启新的worker进程,并要求旧的worker进程停止接受新连接,且在完成对当前请求的响应后退出;若失败,master进程会回滚并继续使用旧的配置;reopen:重新打开log文件。
2)Web/HTTP客户端
最常见的HTTP客户端就是Web浏览器。
2、资源
1)媒体类型:HTTP为Web传输对象打上的MIME类型。MIME(多用途因特网邮件扩展)用来描述并标记多媒体内容。
Web服务器在响应报文的首部指定MIME类型(如Content-type: image/jpeg,表示一种主要的对象类型和一个特定的子类型),浏览器会查看自己是否知道如何处理。
2)URI、URL与URN
(1)URI(统一资源标识符):服务器资源名。它在世界范围内唯一标识并定位信息资源。URI有两种形式,分别称为URL和URN。
(2)URL(统一资源定位符):几乎所有的URI都是URL。它描述了一台特定服务器上某资源的特定位置。大部分URL都遵循一种标准格式,包含三个部分:方案(访问资源所使用的协议,通常是HTTP) + 服务器的因特网地址 + Web服务器上的某个资源。
以下是几个例子:
I、http://www.joes-hardware.com/specials/saw-blade.gif
使用HTTP协议 -> 进入www.joes- hardware.com -> 获取名为/specials/saw-blade.gif的资源
II、http://www.joes-hardware.com/inventory-check.cgi?item=12731
类似于I。这是一个查看库存条目#12731是否有现货的程序的URL。
III、ftp://joe:tools4u@ftp.joes-hardware.com/locking-pliers.gif:使用FTP协议。
(3)URN(统一资源名):形如urn:ietf:rfc:2141。仍处于试验阶段。作为特定内容的唯一名称使用,与目前的资源所在地无关(可以将资源四处搬移)。通过URN,还可以用同一个名字通过多种网络协议来访问资源。
3、事务:一个HTTP事务由一条请求命令和一个响应结果组成。这种通信是通过HTTP报文进行的。
应用程序完成一项任务时通常会发布多个HTTP事务,如请求一个包含丰富图片的页面时,一个事务获取描述页面布局的HTML“框架”,另外的事务获取每个图片、Java小程序等。
1)HTTP方法:HTTP支持的几种请求命令。它告诉服务器要执行什么动作。每条HTTP请求报文都包含一个方法。一些常用的HTTP方法:
(1)GET:从服务器向客户端发送命名资源。
(2)PUT:将来自客户端的数据存储到一个命名的服务器资源中去。
(3)DELETE:从服务器中删除命名资源。
(4)POST:将客户端数据发送到一个服务器网关应用程序。
(5)HEAD:仅发送命名资源响应中的HTTP首部。
2)状态码:每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。常见的状态码如200(OK。文档正确返回)、302(Redirect。到其他地方去获取资源)、404(Not Found。无法找到这个资源)。状态码会伴随一条解释性文本。
4、报文:HTTP服务器和客户端通过HTTP报文进行通信。
HTTP报文(除主体外)是由一行行的纯文本组成,方便调试。它由起始行、首部字段和可选主体三部分组成:
1)起始行(第一行):说明要做些什么(如GET /test/hi-there.txt HTTP/1.0),出现了什么情况(如HTTP/1.0 200 OK)。
2)首部字段:名字和值的集合。名字和值中间以冒号分隔。首部以一个空行结束。
3)可选主体:主体可以包含文本数据和二进制数据。
5、连接:HTTP是应用层协议。它把网络通信的具体细节都交给了通用、可靠的因特网传输协议TCP/IP。
6、协议版本。目前仍在使用的版本:
1)HTTP/0.9:HTTP的1991原型版本。有很多严重的设计缺陷。只支持GET方法,不支持多媒体内容的MIME类型、各种HTTP首部,或者版本号。
2)HTTP/1.0:第一个广泛使用的版本。添加了版本号、各种HTTP首部、一些额外的方法,以及对多媒体对象的处理。这使得包含生动图片的Web页面和交互式表格成为可能。
3)HTTP/1.0+:为满足快速扩张且在商业上十分成功的万维网的需要,添加了很多特性,包括持久的keep-alive连接、虚拟主机支持,以及代理连接支持,成为非官方的事实标准。这种非正式的HTTP扩展版本通常称为HTTP/1.0+。
4)HTTP/1.1:重点关注的是校正HTTP设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。它还包含了对20世纪90年代末正在发展中的更复杂的Web应用程序和部署方式的支持。HTTP/1.1是当前使用的版本。
5)HTTP-NG(HTTP/2.0):HTTP/1.1后继结构的原型建议,重点关注性能的大幅优化,以及更强大的服务逻辑远程执行框架。
7、Web的结构组件(除Web浏览器和Web服务器之外的一些Web应用程序):
1)代理:位于客户端和服务器之间的HTTP中间实体。
HTTP代理服务器是Web安全、应用集成以及性能优化的重要组成模块。出于安全考虑,通常会将代理作为转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。
2)缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。
Web缓存或代理缓存是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程Web服务器下载快得多。
HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。
3)网关:连接其他应用程序的特殊Web服务器。通常用于将HTTP流量转换成其他的协议(如一个HTTP/FTP网关通过HTTP请求接收对FTP URI的请求 -> 通过FTP协议获取文档 -> 将得到的文档封装成HTTP报文,发送给客户端)。
网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
4)隧道:对HTTP通信报文进行盲转发的特殊代理。它通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP连接承载加密的安全套接字层(SSL)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。如图,HTTP/SSL隧道收到一条HTTP请求,要求建立一条到目的地址和端口的输出连接,然后在HTTP信道上通过隧道传输加密的SSL流量,这样就可以将其盲转发到目的服务器上去了。
5)用户Agent代理:代表用户发起HTTP请求的Web客户端程序(如Web浏览器、爬虫)。
8、cookie:当前识别用户,实现持久会话的最好方式。
1)分类
(1)会话cookie:记录了用户访问站点时的设置和偏好。用户退出浏览器时,会话cookie就被删除了。例如,如果设置了Discard参数,或者没有设置Expires或Max-Age参数来说明扩展的过期时间,则为会话cookie。
(2)持久cookie:存储在硬盘上。通常会用它维护某个用户会周期性访问的站点的配置文件或登录名。和会话cookie的唯一区别是它们的过期时间。
2)工作原理:
用户访问Web站点时,Web服务器通过Set-Cookie响应首部将cookie返回给用户。浏览器将其存储在cookie数据库中。当用户再次访问同一站点时,浏览器取出该服务器对应的那些cookie,并在Cookie请求首部中将其传回去。服务器根据cookie识别用户、跟踪会话状态等。
因此,可以把cookie看成由客户端维护的状态片断。
应用:很多Web站点都会与第三方厂商达成协议,由其来管理广告。这些广告被做得像Web站点的一个组成部分,而且它们确实发送了持久cookie。用户访问另一个由同一广告公司提供服务的站点时,(由于域是匹配的)浏览器就会再次回送早先设置的持久cookie。
3)其他属性(过滤器)
(1)域(Domain)属性:控制哪些站点可以看到该cookie。比如:
# 用户访问.airtravelbargains.com结尾的站点时,浏览器才会发送Cookie: user="mary17"Set-Cookie: user="mary17"; domain="airtravelbargains.com"
(2)路径(Path)属性。
比如,www.airtravelbargains.com将http://www.airtravelbargains.com/autos/用于汽车租赁,它用一个cookie记录用户喜欢的汽车尺寸:
Set-Cookie: pref=compact; domain="airtravelbargains.com"; path=/autos/
当用户访问http://www.airtravelbargains.com/specials.html时,只会发送user="mary17"这个cookie;但访问http://www.airtravelbargains.com/autos/cheapo/index.html时,会发送user="mary17"和pref=compact两个cookie。
4)版本
(1)cookies版本0(有时也称Netscape cookies,最初由网景定义):定义了Set-Cookie响应首部、Cookie请求首部以及用于控制cookie的字段。如下:
# expires:指定cookie的实际生存期。过期则不再存储或发送它。格式如"Wednesday, 09-Nov-99 23:12:40 GMT",GMT为唯一合法时区。不指定则cookie在会话结束时过期# secure:若指定该关键字,则只有在HTTP使用SSL安全连接时才发送这个cookieSet-Cookie: name=value [; expires=date] [; path=path] [; domain=domain] [; secure]Cookie: name1=value1 [; name2=value2] ...
(2)cookies版本1(RFC 2965):是对cookies版本0的扩展,但应用不如后者广泛。它引入了Set-Cookie2首部和Cookie2首部,但它也能与版本0进行互操作。
RFC 2965 cookie的主要改动:为每个cookie加上解释性文本;允许在浏览器退出时,不考虑过期时间而将cookie强制销毁;用相对秒数而不是绝对日期来表示cookie的Max-Age;通过URL端口号,而不仅是域和路径来控制cookie;通过Cookie首部回送域、端口和路径过滤器(若有);为实现互操作性使用的版本号(Cookie2: $Version="1");在Cookie首部从名字中区分出附加关键字的$前缀(如Cookie2: ID="29046"; $Domain=".joes-hardware.com"; $Path="/tools")。
参考资料:
《HTTP权威指南》
http://httpd.apache.org/docs/2.2/
不断学习中。。。