一、Web/HTTP服务器和客户端html
1)Web/HTTP服务器nginx
Web内容都是存储在Web服务器上的。Web服务器使用HTTP协议,所以常常被称为HTTP服务器。如下简单介绍两种HTTP服务器:数据库
(1)Apache:目前世界上最普遍使用的HTTP服务器软件。apache
安装: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模块有:
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浏览器。
二、资源
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,还能够用同一个名字经过多种网络协议来访问资源。
三、事务:一个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。没法找到这个资源)。状态码会伴随一条解释性文本。
四、报文:HTTP服务器和客户端经过HTTP报文进行通讯。
HTTP报文(除主体外)是由一行行的纯文本组成,方便调试。它由起始行、首部字段和可选主体三部分组成:
1)起始行(第一行):说明要作些什么(如GET /test/hi-there.txt HTTP/1.0),出现了什么状况(如HTTP/1.0 200 OK)。
2)首部字段:名字和值的集合。名字和值中间以冒号分隔。首部以一个空行结束。
3)可选主体:主体能够包含文本数据和二进制数据。
五、链接:HTTP是应用层协议。它把网络通讯的具体细节都交给了通用、可靠的因特网传输协议TCP/IP。
六、协议版本。目前仍在使用的版本:
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后继结构的原型建议,重点关注性能的大幅优化,以及更强大的服务逻辑远程执行框架。
七、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浏览器、爬虫)。
八、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安全链接时才发送这个cookie Set-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/
不断学习中。。。