一、网站系统的组成
只要在一台计算机上安装了 WEB 服务器软件,从功能上讲,这台计算机就可以称为 WEB 服务器。一个网站的规模可大可小,功能可多可少,最简单 的网站只需要一台 Web 服 务器即可对外提供网页浏览服务。复杂的网站包括多台 WEB 服 务器组成的群集系统、负载均衡设备、具有缓存功能的代理服务器(可以有多级,甚至包括放置在服务器端的缓存系统)、数据库系统等,如图 2.2 所示。
图 2.2
www.sina.com 网 站系统采用的基本上就是图 2.2 所 示的架构,不同地区的人们在访问 www.sina.com 站 点时,浏览器实际上所访问的服务器是不一样的,例如,吉林省的用户访问的服务器实际是 sina 放在吉林地区的代理服务器,湖北省的用户访问的服务器实际是 sina 放在湖北地区的代理服务器。各地区的浏览器访问 www.sina.com 站 点的过程如图 2.3 所 示。
图 2.3
为了能够让浏览器透明地访问到 WEB 站点,让用户感觉不到是在访问区域代理服务器,在 DNS 系统中需要将 www.sina.com 主机名指向所有的区域代理服务器的 IP 地址。在浏览器访问 www.sina.com 站点中的页面而向 DNS 服务器请求解析 www.sina.com 主机名时, DNS 服务器根据访问者的地理位置信息返回他附近的区域代理 服务器的 IP 地址,这 样,浏览器的访问请求将发送给该区域代理服务器。只有当区域代理服务器中没有浏览器要访问的页面时,区域代理服务器才去从真正的 www.sina.com 站点服务器上获取该页面并进行缓 存,以后该区域的其他浏览器就都可以就近从区域代理服务器中访问到该页面了,从而大大提高了访问效率和减少了网络流量。
WEB 浏 览器与 WEB 服务器建 立连接后,除了将请求 URL 中 的资源路径发送给 WEB 服 务器外,还会将 URL 中 的主机名部分作为 HTTP 请 求消息的 Host 头发 送给 WEB 服务器。例 如,在浏览器地址栏中输入 http://www.it315.org , 浏览器发送给 www.it315.org 主 机上的 WEB 服务器的 请求消息内容如下:
GET / HTTP/1.1< 回车 >
Host: www.it315.org< 回车 >
< 回 车 >
WEB 服 务器接收到浏览器的访问请求消息后,根据 Host 头 字段中所设置的主机名,就知道该选择哪个 WEB 站 点来进行响应,因此,可以使用不同的主机名来作为区分同一个 WEB 服 务器上的不同站点的标识信息。
Tomcat 的 Server.xml 配置文件中有一个 <Host> 元素,一个 <Host> 元素用于建立一个 WEB 站点,使用多个 <Host> 元素则可以建立多个 WEB 站点。 <Host> 元素的父级元素为 <Engine> 元素,嵌套在同一个 <Engine> 元素中的多个 <Host> 元素的 name 属性不能相同, <Host> 元素的 name 属性指定 WEB 站点所对应的主机名称。 Tomcat 的 Server.xml 配置文件中初始设置的 <Host> 元素内容如下:
<Host appBase="webapps" …>
…
</Host>
<Host> 元 素中的 appBase 属 性指定了一个路径,该路径将作为嵌套在它里面的 <Context> 元 素的 docBase 属 性中设置的相对路径的基准路径。
当 Tomcat 接 收到访问请求时,将比较请求消息中的 Host 头 字段的值与 <Host> 元 素的 name 属性值, 并以匹配的 <Host> 元 素所创建的 WEB 站点 来响应。如果 Server.xml 文 件中没有与请求消息的 Host 头 字段匹配的 <Host> 元 素, Tomcat 将以 默认的 WEB 站点来响 应。只要 <Engine> 元 素的 defaultHost 属 性设置为嵌套在它里面的某个 <Host> 元 素的 name 属性值, 该 <Host> 元 素所创建的 WEB 站点 就成了该引擎的默认 WEB 站 点。例如, Tomcat 的 Server.xml 文件中的 <Engine> 元素的默认设置如下:
<Engine defaultHost="localhost" debug="0">
…
<Host name="localhost" appBase="webapps" …>
…
</Host>
…
</Engine>
上面的这段配置信息说明,该引擎的默认 WEB 站点为嵌套在 <Engine> 元素中的 name 属性为“ localhost ”的 <Host> 元素所创建的 WEB 站点。
在同一台计算机上建立了多个基于主机名的虚拟主机后, WEB 浏览器要访问其中的某个虚拟主机的资源时,在访问 URL 中必须采用主机名,而不能采用 IP 地址。这是因为 WEB 浏览器要将 URL 中的主机名部分作为 HTTP 请求消息的 Host 头发送给 WEB 服务器,如果 URL 中的主机名部分使用的是 IP 地址,那么,浏览器发出的请求消息中的 Host 头字段的值就是这个 IP 地址,而在同一台计算机上建立的多个基于主机名的虚拟主 机共享同一个 IP 地 址,在 Host 头字段 使用 IP 地址根本就无 法区分不同的站点。
即使在 URL 中 指定的是主机名时, WEB 浏 览器还是要先获得该主机名所对应的 IP 地 址,然后再使用这个 IP 去 连接 WEB 服务器。所 以,在建立基于主机名的虚拟主机时,除了要在 Tomcat 的 server.xml 文件中进行设置外,还需要在整个网络系 统中建立主机名与 IP 地 址的映射关系,即必须将主机名添加到名称解析系统,以便 WEB 浏 览器能够从名称解析系统中查询出主机名所对应的 IP 地 址。建立主机名与 IP 地 址的映射关系的惯用方式有两种:一是使用客户机本地的 Hosts 文件,二是使用 DNS(Domain Name System ,域名系统 ) 服务器。 Hosts 文件和 DNS 的作用都是允许用户使用“友好”的、文本格式的主机名称,而不是数字格式的 IP 地址来访问网络中的计算机。 Hosts 文件可用于小型的 Intranet (企业内部网),网络中的所有计算机上都需 要使用 Hosts 文 件。 DNS 通常用于大 型的网络,特别是 Internet 上 对外提供服务的计算机都是通过 DNS 来 建立其主机名与 IP 地 址的映射关系。客户机首先在本地的 Hosts 文 件中查找主机名称所映射的 IP 地 址,如果没有找到,再去查询 DNS 服 务器。为了简单起见,这里仅介绍一下 Hosts 文 件。对于 Windows 2000 系 统, Hosts 文件 位于操作系统根目录(取决操作系统所在的分区,通常是 c:/winnt ) 下的 System32/Drivers/Etc 子 目录中,默认情况下,该文件中有如下一行内容:
127.0.0.1 localhost
这行文本的作用就是将 IP 地址( 127.0.0.1 )映射成主机名( localhost ),这也就是在 IE 浏览器地址栏中可以使用 localhost 访问本地 WEB 服务器的原因。如果要增加更多的主机名与 IP 地址的映射,可以在 Hosts 文件中增加更多的行,然后参照上面这行内容的格式 在每行中填写 IP 地址 和相应的主机名。
: 动手体验: 使用 Tomcat 建 立基于主机名的虚拟主机
( 1 ) 用 UltraEdit 打 开 <Tomcat 主 目录 >/conf 目 录下的 Server.xml 文 件,使用“查找”菜单查找内容为“ </Host> ” 的行,紧接该行下面增加一对 <Host></Host> 标 签。参照前面的 <Host> 标 签的属性设置情况,设置新增的 <Host> 标 签的属性,并在它里面嵌套一个设置该 WEB 站 点根目录的 <Context> 元 素,最终的内容如下:
<Host name="site1" debug="0" appBase="d:/VirtualHost1">
<Context path="" docBase="." debug="0"/>
</Host>
这样,将创建一个新的 WEB 站点。上面的 <Context> 元素的 docBase 属性值被设置为一个点( . ),即表示使用 <Host> 元素的 appBase 属性中所设置的路径作为这个 <Context> 所映射的目录。
( 2 ) 在上面新增的 <Host></Host> 标 签对下面再增加一对 <Host></Host> 标 签,并将它设置为如下形式:
<Host name="site2" debug="0" appBase="d:/VirtualHost2">
<Context path="" docBase="." debug="0"/>
</Host>
这又创建了一个新的 WEB 站点,该站点的主机名称为 site2 ,根目录对应的本地文件系统目录为 d:/VirtualHost2 。
( 3 ) 在 d: 盘下创建名称为 VirtualHost1 和 VirtualHost2 两个目录,并在这两个目录中分别创 建一个名为 test.html 的 文件,在 d:/VirtualHost1/test.html 文 件中写入如下一行内容:
这是 d:/VirtualHost1 目录中的test.html 文 件
在 d:/VirtualHost2/test.html 文 件 中写入如下一行内容:
这是 d:/VirtualHost2 目录中的test.html 文 件
( 4 ) 保存修改后的 Server.xml 文 件,重新启动 Tomcat WEB 服 务器程序。 打开一个新的命令行窗口中,并在这个命令行窗口中执行如下命令:
telnet 127.0.0.1 8080
接着在 连接成功的 telnet 程序命令窗口中,输入如下内容:
GET /test.html HTTP/1.1< 回车 >
Host:< 空 格 >site1< 回 车 >
< 回 车 >
这时在 telnet 程 序窗口中可以看到, WEB 服 务器返回内容的正文部分为 d:/VirtualHost1/test.html 文 件中的内容。接着 WEB 服 务器返回内容的下边,输入如下内容:
GET /test.html HTTP/1.1< 回车 >
Host:< 空 格 >site2< 回 车 >
< 回 车 >
在 telnet 程 序窗口中又可以看到, WEB 服 务器这次返回内容的正文部分为 d:/VirtualHost2/test.html 文 件中的内容。接着 WEB 服 务器返回内容的下边,输入如下内容:
GET /test.html HTTP/1.1< 回车 >
Host:< 空 格 >< 回 车 >
< 回 车 >
在 telnet 程 序窗口中又可以看到, WEB 服 务器这次返回内容的正文部分为 d:/test/test.html 文 件中的内容。接着 WEB 服 务器返回内容的下边,再次输入如下内容:
GET /test.html HTTP/1.1< 回车 >
Host:< 空 格 >xxx< 回 车 >
< 回 车 >
在 telnet 程 序窗口中又可以看到, WEB 服 务器这次返回内容的正文部分仍然为 d:/test/test.html 文 件中的内容。
上面的整个交互过程如图 2.34 所示, Tomcat 根据第 1 次和第 2 次 请求中所指定 Host 头 的值,查找 Server.xml 文 件中与之相匹配的 <Host> 元 素的 name 属性值, 并以匹配的 <Host> 元 素所设置的 WEB 站点 来响应;在第 3 次和第 4 次请求中所指定 Host 头的值,在 Server.xml 文件中没有与之对应的 <Host> 元素的 name 属性值, Tomcat 将以默认的 WEB 站点来响应。
图 2.34
( 5 ) 在 Windows 2000 系 统中,用记事本程序打开 c:/winnt/System32/Drivers/Etc/Hosts 文 件,可以看到有如下一行内容:
127.0.0.1 localhost
紧接这行文本的下面,用它复制出两行文本,并将这两行文本中的 localhost 分别修改成 site1 和 site2 ,这样,就使用 Hosts 文件为当前计算机设置了多个主机名。如果要用 site1 和 site2 这个两主机名访问其他计算机上的 WEB 站点,则应将 127.0.0.1 修改成其他计算机的实际 IP 地址。保存 Hosts 文件后,在命令行窗口中执行“ ping site1 ”和“ ping site2 ”命令,查看该主机名是否被正确解析到 了相应的 IP 地址上。 建立 site1 和 site2 与计算机 IP 地址的映射后,在 IE 浏览器地址栏中输入 http://localhost:8080/test.html 、 http://site1:8080/test.html 和 http://site2:8080/test.html , 可以看到浏览器将显示出各自站点中的 test.html 网 页文件的内容。
可见,使用主机名的方式在同一台 WEB 服务器上创建多个虚拟主机后,在 WEB 浏览器中使用主机名访问 Web 服务器时, Web 服务器将选择与该主机名关联的 WEB 站点进行响应。通过这种方式,多个 WEB 站点可以共享同一个 IP 地址和相同的端口号,唯一不足的就是 WEB 浏览不能通过 IP 地址去访问这些 WEB 站点。基于主机名的虚拟主机是目前 Internet 上的大多数虚拟主机业务提供商所通常采用的 方式。只要找出几个小型公司或个人的网站,如果在 WEB 浏 览器地址栏中输入“ http:// 主 机名”可以访问到该 WEB 站 点,接着在命令行窗口中执行“ ping 主 机名”,查看到该域名对应的 IP 地 址,然后在 WEB 浏览 器地址栏中输入“ http://IP 地 址”时,却无法访问这个 WEB 站 点了,那么,这个 WEB 站 点就是一个基于主机名的虚拟主机,它与其他一些 WEB 站 点共享一台 WEB 服务 器,而不是自己独享一台 WEB 服 务器。
注意 :当使用安全套接字层 (SSL) 时,不能使用主机头字段来实现虚拟主机,这是 因为使用 SSL 的 HTTP 请求有加密保护。主机头字段是加密内容的一部分,不 能被解释和路由到正确的站点。