一、网站
系统
的组成
只要在一台计算机上安装了
WEB
服务器
软件
,从
功能
上讲,这台计算机就可以称为
WEB
服务器。一个网站的规模可大可小,功能可多可少,最简单的网站只需要一台
Web
服务器即可对外提供网页浏览服务。复杂的网站包括多台
WEB
服务器组成的群集系统、负载均衡设备、具有缓存功能的代理服务器(可以有多级,甚至包括放置在服务器端的缓存系统)、
数据库
系统等,如图
2.2
所示。
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 站点来响应。
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 请求有加密保护。主机头字段是加密内容的一部分,不能被解释和 路由 到正确的站点。
图
2.2
图
2.3
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
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 请求有加密保护。主机头字段是加密内容的一部分,不能被解释和 路由 到正确的站点。