2006年9月23日星期六

第四节 动态网站的开发

  在 Internet 上有许多交互式的网站,如留言簿、同学录、网上购物等,这些动态效果仅仅依靠 FrontPage、Dreamweaver 等网页制作软件软件所产生的 HTML页面是较难以实现的,必须采用动态网站开发技术。用 Perl 开发 CGI 程序是比较古老的一种做法,并且其怪异的语法令许多初学者望而却步,不过救世主总算出现了,那就是 PHP。
 
1、认识 PHP

 
  早期 WWW 服务器所使用的 HTML 语言功能十分有限,只能描述简单的内容,难以进行复杂的信息处理,尤其是无法满足 Web 数据库的处理要求。为此人们绞尽脑汁想了很多解决办法,其中 SSI(Server Side Include)技术在目前被认为是一种较好的解决方案。

 
  SSI 说得简单些其实只是一种 WWW 服务器可以识别和理解的脚本,通常将其嵌入到 HTML 页面中,当客户端浏览器在请求这种特殊的网页时,WWW 服务器会对SSI 脚本进行解释,执行相应的动作,并将执行结果输出到最后返回给浏览器的HTML 页面中,从而实现动态效果。

 
  举个简单的例子帮助理解一下,当你登录某个网站时,位于 WWW 服务器端的一段代码 SSI 脚本被激活,它首先获得系统当前时间,然后根据结果判断出现在是上午、下午或者晚上,最后依据判断结果动态生成 HTML 页面给客户端浏览器。这就不难解释为什么你在一天中的不同时刻访问一些网站时,会看到诸如“早上好”、“下午好”、“晚上好”这样不同的欢迎信息。

 
  实现 SSI 的方式有很多种,PHP 是在 Linux 平台下较为流行的一种,其功能十分强大,许多大型的商业网站都是采用 PHP 开发的。PHP 早期的版本只是一个简单的个人主页制作工具,仅包括一个可以解释几条指令的分析引擎和一组用于信息反馈的工具(如留言簿、计算器等)。1995年,PHP 创始人 Rasmus 重写了整个解释器,将个人主页工具、表单集成工具组合在一起,并加入了对 mSQL 数据库的支持,这样就有了 PHP/FI2.0。
 
  到了1997年,PHP 从作者的个人爱好成功地转变为一个有组织的集体活动,整个解释器被重写,形成了 PHP3 的雏形,此时已经有大量的商业化产品(如C2的StrongHold Web Server)开始捆绑 PHP/FI 或 PHP3。

 
  当 PHP3 在自由发展的同时,Zend 公司重写了 PHP 的核心引擎,大大提高了PHP3 的执行效率,这就是现在仍广泛使用的 PHP4。经过优化的 PHP4 执行速度更快,一点也不比传统的 CGI 或 Microsoft 的 ASP 差,更重要的是它还有更多更好的新功能和更丰富的函数库。无论你接不接受,PHP 无疑都将在 CGI 领域中掀起一场新的革命。好了,现在我们就一起开始 PHP 这段愉快的旅程吧。

 
  PHP 实际上是一种解释性的程序设计语言,虽然也能够作为一门单独的语言使用,但更深常见的做法还是将其嵌入到 HTML 网页中,作为开发动态网站的一种方法。下面是一个最简单的 PHP 脚本 test.php:

 
  上页的 PHP 脚本中只有几行有用,其它的都是标准的 HTML 语法。PHP 中的echo 函数类似于 C 语言中的 printf 函数,用于内容的输出,Apache 负责截取PHP 输出信息,并将其插入到 HTML 页面中,这就是 PHP 能够产生动态页面的基本方法。脚本 test.php 经 Apache 处理后将变成类似如下的 HTML 页面:
 
  客户端浏览器负责将最终生成的 HTML 页面显示出来,如图 6-4-1 所示。由于PHP 代码的解释和执行是在 Apache 服务器上完成的,因此客户端浏览器只要能处理普通的 HTML 页面就可以了。
 
图 6-4-1 PHP 页面浏览效果
 
2、搭建 PHP 运行环境

  Apache 和 PHP 简直可以算得上是天作之合。一方面 PHP 可以扩充 Apache 的功能,使其具备了动态能力,而另一方面 Apache 又为 PHP 提供了良好的运行环境,令它的功能可以得到最充分的发挥。不过为了让 Apache 能够支持 PHP,首先还得做些配置才可以。
 
  由于 PHP 的应用范围越来越广,许多 Linux 发行版本都自带了 PHP 软件包,Red Hat Linux AS 4 使用的是 PHP4.2.2,在命令行方式下用 rpm 命令可以查看是否已经安装了 PHP:

  [root@kevin ~]#rpm -qa php
  php-4.2.2-17 (# 已经安装了PHP)

 
  如果没有看到任何输出信息,则表明在安装 Red Hat Linux AS 4 时,可能忘记选择 PHP 软件包了。现在需要以 root 用户的身份登录 KDE,然后单击 KDE 主菜单,从『系统设置』菜单下选择『添加/删除应用程序』命令。当『软件包管理』窗口打开后,在『服务器』区域中将『万维网服务器』套件选中,如图 6-4-2 所示。

 
图 6-4-2 安装 WWW 服务器套件
 
  由于 PHP 只是一个可选的软件包,所以应该单击右侧的『细节』按钮,打开『WebServer 软件包细节』窗口,在『额外软件包』区域中将『php』项选中,如图6-4-3 所示。

 
图 6-4-3 选择 PHP 软件包
 
  选择好要安装的软件包后,单击『软件包管理』窗口中的『更新』按钮,然后按照提示插入安装光盘,就可以完成 PHP 软件包的安装了。

 
  安装好 PHP 后,还需要对 Apache 服务器进行相应的配置,使得两者能协调一致地工作。打开浏览器并登录 Webmin 后单击『服务』→『Apache服务器』,打开『Apache WEB 服务器』页面。由于 PHP 是作为 Apache 中的一个模块动态加载的,因此需要先对 Apache 模块进行配置,如图 6-4-4 所示。

 
图 6-4-4 管理 Apache 模块
 
  单击『Apache模块』图标,进入配置页面,在『活动模块』列表中确保mod_php4 模块已被选中,如图 6-4-5 所示。

 
图 6-4-5 PHP 支持模块
 
  如果找不到该模块,可能需要在『Apache WEB 服务器』页面中单击『重新配置已知的模块』图标,进入『重新配置已知的模块』页面,对 Webmin 支持的Apache 模块进行重新配置。

 
  配置好 Apache 服务器加载的 PHP 模块后,单击『保存』按钮,退回到『Apache WEB 服务器』页面。为了让 Apache 能够通过文件扩展名识别出哪些文件中包含了 PHP 脚本,需要为其添加特定的 MIME 类型。在『Apache WEB 服务器』页面的『虚拟服务器』区域中单击『缺省服务器』图标,进入『虚拟服务器选项』页面,在这里可以对 Apache 服务器支持的 MIME 类型进行管理,如图 6-4-6 所示。

 
图 6-4-6 管理 MIME 类型
 
  单击『MIME类型』图标进入『MIME类型』页面后,首先在『扩展MIME类型』文本框中输入为 PHP 专门定义的 MIME 类型 application/x-httpd-php,然后在『扩展』文本框中为 Apache 服务器指明以哪些扩展名结束的文件将使用 PHP 引擎进行处理,可以为同一种 MIME 类型指定多个与这对应的扩展名,如图 6-4-7 所示。设置好 MIME 类型对应的扩展名后,单击『保存』按钮确定。

 
图 6-4-7 MIME 类型对应的扩展名
 
  好了,重新启动 Apache 服务器吧,现在应该可以处理 PHP 脚本了。可以将前面介绍的那个 test.php 脚本复制到 /var/www/html/ 目录下,然后通过访问http://www.mylinux.org/test.php 来测试一下 PHP 模块的正确性。不过还有一种更好也更全面的测试方法,那就是在 /var/www/html/ 目录下生成一个内容如下的info.php 脚本:

 
  在浏览器中访问该脚本,如果 PHP 模块能正常工作,可以从中获得 PHP 模块运行时的各种信息。
 
3、用 PHP 开发动态网站

 
  许多网站现在都有计数器功能,用于记录一共有多少人访问了该网站。用 PHP实现这一功能十分简单,从中不难领略到 PHP 的迷人魅力。计数器的原理说起来其实很简单:当用户浏览网页时,服务器程序从文件中读取该页面被访问的次数,将添加1后显示给该用户,然后再将新的计数登值存回到文件中。

 
  首先在 /var/www/html/ 目录下生成一个内容如下的 counter.php 文件:

 
  将 PHP 语句加入到 HTML 文件中有以下几种方法:

  第一、
  第二、
  第三、echo"嵌入PHP语句"
  第四、<% echo "嵌入PHP语句" %>
 
  其中第一种和第二种是最常用的方法,即在小于符号后加上问号,然后可加可不加“php”,之后就是 PHP 的程序代码,在 PHP 代码结束后,再加入问号及大于号就可以了。第三种写法对熟悉 JavaScript 的用户来说有相当的亲切感。而那些从 Windows 平台下的 ASP 转向 Linux 平台下的 PHP 用户来说,对第四种写法肯定有种似曾相识的感觉。

 
  编写 PHP 程序最好的方法是先处理纯 HTML 格式的静态页面,然后在需要动态处理的地方插入 PHP 语句,这样开发时可以达到事半功倍的效果。

 
  上述 PHP 计数器程序的核心是 displayCounter 函数。它首先调用 fopen 函数打开保存了计数值的文件,然后从中读出当前的计数值,并将其加1后作为新的计数值显示给当前浏览网页的用户,最后通过 exec 函数执行两条 Linux 命令将新的计数值写入到文件中。

 
  在浏览器中查看该 PHP 文件时,你将看到该段代码为你统计出来的访问次数。

 
  PHP 语法简单、功能强大,是开发动态网站的得力助手,相信你在实际应用中会慢慢喜欢上它的。虽然 Perl、Python、ASP、JSP 等服务器端脚本语言导出不穷,但如果愿意留一次机会给 PHP,它将不会让你失望的。

第三节 授权访问

  作为 Apache 服务器的管理员,应该知道如何对一些关键信息进行保护,也就是说只有合法的授权用户才可以访问它们。Apache 提供了两种授权访问方式:一种是根据用户的 IP 地段、网段、主机名等信息来决定是否具有访问权,例如可以只允许 mylinux.org 域中的主机能访问 Apache 服务器,这种授权访问方式通过Apache 服务器配置文件 /etc/httpd/httpd.conf 就可以完成;另一种是提供登录形式的授权访问,用户访问页面需要输入用户名和密码,这种授权访问方式需要配置“.htaccess”存取控制文件,是较常用的一种用户授权访问方式。
 
1、基于主机的授权
 
  Apache 服务器的授权访问功能需要 mod_auth 和 mod_auth_dbm 两个模块的支持。在 Webmin 中单击『服务』图标,进入服务器管理页面,然后单击『Apache服务器』图标,进入『Apache WEB 服务器』页面,在这里可以对 Apache 服务器加载的模块进行管理,如图 6-3-1 所示。
 
图 6-3-1 管理加载的模块
 
  单击『Apache模块』图标,进入『Apache模块』页,在活动模块列表中将mod_auth 和 mod_auth_dbm 两个模块均选中,如图 6-3-2 所示。
 
图 6-3-2 授权访问支持模块
 
  配置好 Apache 服务器动态加载的模块后,单击『保存』按钮,返回『ApacheWEB 服务器』页面。下面先来介绍基于主机的授权访问方式。
 
  假设 www.mylinux.org 网站中有一个 /var/www/secret/ 目录,接着来看如何通过授权来限制用户对该资源的访问。由于是要对 www.mylinux.org 这一虚拟主机进行管理,因此应该在『Apache WEB 服务器』页面中的『虚拟服务器』区域中单击该虚拟主机对应的图标,如图 6-3-3 所示。
 
图 6-3-3 管理 www.mylinux.org 网站
 
  进入『虚拟服务器选项』页面后,从『创建目录、文件或目录选项』区域中的『类型』下拉框中,选择『Directory』项,并在『路径』文本框中输入要进行设置的目录“/var/www/secret”,然后单击『新建』按钮创建这一目录,如图 6-3-4所示。注意此时指定目录只是将其纳入 Apache 的管理,但该目录必须事先已经在磁盘上存在了。
 
图 6-3-4 创建目录
 
  新目录创建后,就可以在『按目录选项』区域中找到该目录对应的图标了,如图 6-3-5 所示。
 
图 6-3-5 新创建的目录
 
  对目录的配置与缺省服务器类似。单击该目录对应的图标,进入『按目录选项』页面。在这里可以对该目录的所有属性进行配置,其中就包括对目录访问权限的控制,如图 6-3-6 所示。
 
图 6-3-6 配置目录
 
  单击『访问控制』图标,进入『访问控制』页面。如果想让 IP 地址为218.168.100.5 的机器访问该目录,可能先在『约束访问』区域的『动作』列中选择『Allow』项,然后在『条件』列中选择『从IP请求』项,最后在随后的文本框中输入允许访问的 IP 地址,如图 6-3-7 所示。
 
图 6-3-7 允许访问的 IP 地址
 
  单击『保存』按钮并重新回到『访问控制』页面后,就又可以在『约束访问』区域中指定其它的约束规则了。例如从『动作』列中选择『Deny』项,并从『条件』列中选择『从网络/掩码请求』项,然后在后面的文本框中输入“218.168.100.0/255.255.255.0”,可以限制子网 218.168.100 中所有主机对该目录的访问,如图 6-3-8 所示。
 
图 6-3-8 拒绝访问的网络
 
  也许你已经注意到了,第一条访问规则允许 IP 地址为 218.168.100.5 的主机访问该目录,而第二条访问规则又拒绝 218.168.100 子网中的所有主机访问该目录,这岂不是自相矛盾吗?
 
  Apache 通过设置访问规则的优先级来解决这一问题,管理员可以自定义是先使用允许(allow)规则还是拒绝(deny)规则,(注意在后面应用的规则将覆盖前面应用的规则)。在这里我们显然应该先应用 deny 规则,拒绝 218.168.100 子网中的所有主机访问请求,然后再应用 allow,允许主机 218.168.100.5 访问该目录。在『约束访问』区域中的『访问检查次序』中选择『先禁止后允许』单选框,就可以指定正确的访问规则应用顺序了,如图 6-3-9 所示。
 
图 6-3-9 访问规则应用次序
 
  单击『访问控制』页面底部的『保存』按钮,回到『按目录选项』页面后单击『文档选项』图标,进入『文档选项』页面。除了指定该目录能被哪些主机访问之外,还应该在『目录选项』中为其指定正确的操作选项,如图 6-3-10 所示。注意,若不想使用缺省值,应该将『已选择以下』单选框选中。
 
图 6-3-10 设置目录选项
 
  设置好文档目录选项后,单击『保存』按钮返回到『按目录选项』页面,然后单击页面底部的『回到服务器索引』链接,返回『虚拟服务器选项』页面,为了使用户能够更好的访问 /var/www/secret 目录,可以为它指定一个别名,如图 6-3-11 所示。
 
图 6-3-11 管理别名和重定向
 
  单击『别名和重定向』图标,进入『别名和重定向』页面。分别在『文档目录别名』区域中的『From』和『To』文本框中输入“/secret/”和“/var/www/secret/”,然后单击页面底部的『保存』按钮,就可以为/var/www/secret/ 目录指定一个别名 /secret/,如图 6-3-12 所示。
 
图 6-3-12 创建文档目录别名
 
  回到『虚拟服务器选项』页面后,单击『应用更改』链接,使新的设置值生效。在放置一些将被访问的资源到 /var/www/secret/ 目录下后,就可以进行授权访问的测试了。当从 IP 地址为 218.168.100.5 的主机通过http://www/mylinux.org/secret/ 来访问这些资源时,将看到资源列表。
 
  但如果是从其它机器访问时,由于缺乏相应的权限,将无法浏览到该目录下的资源。
 
2、基于用户的认证
 
  基于主机的授权方式难以满足具有较高安全要求的场合,因为即使是一个很蹩脚的初级黑客也完全有能力仿造一个假的 IP 地址,因此有时就不得不考虑基于用户的认证方式。
 
  事实上,基于主机的授权方式和基于用户的认证方式并非是截然分开的。当用户访问 Apache 服务器的某个目录时,Apache 会先根据配置文件 httpd.conf 中Directory 的设置,来决定是否允许用户访问该目录。如果允许,则 Apache 还会继续查找该目录或其父目录中是否存在“.httpd.conf”文件,以决定是否要对用户进行身份认证。
 
  正是因为“.httpd.conf”文件在基于用户的认证方式中起着很重要的作用,所以首先要做的事情就是在要进行身份认证的目录下生成该文件。假设要让用户必须通过身份认证后才能访问 /var/www/secret/ 目录下的资源,就应该先创建/var/www/secret/.httpd.conf 文件。虽然使用普通的文本编辑器也能手工生成该文件,但使用 Webmin 将更方便些。
 
  在『Apache WEB 服务器』页面中,可以通过『按目录选项文件』来管理所有的“.httpd.conf”文件,如图 6-3-13 所示。
 
图 6-3-13 管理认证文件
 
  单击『按目录选项文件』图标,进入『按目录选项文件』页面。接着单击『创建选项文件』右侧的『...』按钮,打开『选择文件』窗口,从中选择要为其创建“.httpd.conf”文件的目录,如图 6-3-14 所示。
 
图 6-3-14 选择认证目录
 
  选择好要进行认证的目录后,单击『创建选项文件』按钮,Webmin 就会在该目录下生成一个“.httpd.conf”文件,同时打开『按目录选项』页面。在这里可以对该文件的内容进行编辑和管理,如图 6-3-15 所示。
 
图 6-3-15 设置认证文件
 
  文件“.httpd.conf”由一系列 Apache 指令组成。那些对这些指令早就一清二楚的资深 Apache 管理员可以很轻松地使用自己熟悉的编辑器,手工修改这些文件,但对于连这些指令是什么都还不知道的初学者来说 Webmin 的确是个不错的跳板,它可以帮助你很快成为一名合格的 Apache 管理员。单击『显示指令』图标,进入『指令』页面,在『编辑Apache指令』按钮旁边的下拉框中,可以找到所有的Apache 指令,如图 6-3-16 所示。
 
图 6-3-16 选择 Apache 指令
 
  Apache 提供的指令虽然多,但常用的也就那么几条,而且 Webmin 还提供了很好的配置界面。从 Apache 指令下拉框中选择『AuthName』指令,然后单击『编辑Apache指令』按钮,进入『访问控制』页面。可以在『认证真名』文本框中输入一个字符串作为提示信息。浏览器访问该目录时,弹出的登录提示对话框中将显示该字符串。
 
  在『认证类型』下拉框中,可以选择进行身份认证的方式。Apache 目前提供两种认证方式:Basic(基本认证)和 Digest(简要认证)。一般使用 Basic 方式,但使用方 Digest 方式会更安全一些。
 
  在『登录约束的访问』区域中,可以指明只允许某些特定的用户或者组登录,当然也可以允许所有的合法用户登录。注意此外的用户和组指的都是 Apache 服务器自己维护的用户和组,他们同 Linux 系统的用户和组可以没有任何瓜葛。
 
  Apache 服务器自身维护了一个用户和组列表,同样也有用户密码文件和组文件。这两个文件存放的位置可以由你在『文本文件认证』区域中任意指定。出于安全性的考虑,建议管理员不要将该文件与网站中的数据存放在一起。至于创建该文件的方法,后面将会介绍,这里只需指定这两个文件的路径就可以了。
 
  好了,现在单击『访问控制』页面底部的『保存』按钮,返回到『按目录选项文件』页面。接着单击该页面中的『当前模块首页』链接,进入『Apache WEB 服务器』页面。由于对 /var/www/secret/ 目录同时采用了基于主机的授权方式和基于用户的认证方式,难免会造成两者在某些地方的冲突。如果你现在从218.168.100.5 的主机访问 http://www/mylinux.org/secret/ 时,不必登录,Apache 也会将这些信息大大方方的显示出来。
 
  为了避免这一问题,应该明确告诉 Apache 在处理“.httpd.conf”文件时,哪些指令可以覆盖 .httpd.conf 中定义的参数,这些参数包括 AuthConfig、FileInfo、Indexs、Limits 和 Options。可以同时选择多个,如果全选则可以用All 参数代替,但如果一项都不选,则应该使用 None 参数。
 
  现在是不是有点明白了呢?没错,应该对 /var/www/secret/ 目录的选项再稍做调整,以满足基于用户认证的需要。单击『Apache WEB 服务器』页面『虚拟服务器』区域中网站 www.mylinux.org 所对应的虚拟主机图标,进入『虚拟服务器选项』页面后单击『按目录选项』区域中的『Directory /var/www/secret/』图标,打开『按目录选项』页面。由于对 /var/www/secret/ 目录采用基于用户的认证方式,因此需要配置恰当的文档选项。
 
  单击『文档选项』图标,进入『文档选项』页面,在『选择文件可覆盖』区域中选择『已选择以下』单选框,然后从下面的列表中选择“.httpd.conf”文件要覆盖“.httpd.conf”文件中的哪些参数。
 
  现在单击『文档选项』页面中的『保存』按钮,返回到『按目录选项』页面,单击该页面顶部『应用更改』链接根据新的设置值重新加载 Apache 服务器。此时若再从 218.168.100.5 的主机访问 http://www/mylinux.org/secret/,就可以看到要求用户先进行登录的窗口。
 
  现在只有合法的 Apache 用户才能访问该目录下的资源了。
 
  基于用户的认证方式可以很好地保护资源,使得只有授权的用户才能访问某些敏感的数据,不登录就访问资源现在已经变得不可能了,因为将吃到闭门羹。

第二节 主页空间管理

  Apache 很吸引人的一点就是它可以对主页空间进行灵活而有效的管理。不仅可以为系统中的第个用户提供自己的主页空间,还可以利用 Apache 的虚拟主机功能在同一台机器是架设多个网站。如果不希望所有的用户都能够访问 WWW 服务器时,Apache 的授权访问机制又为此提供了一个很好的解决方案。
 
1、开辟个人主页空间

 
  经常能看到某些商业网站为自己的注册用户提供个人主页服务,使用 Apache来实现这一功能并不困难。打开浏览器并登录 Webmin 后,单击『服务』图标进入服务管理页面,然后单击『Apache 服务器』图标进入『Apache WEB 服务器』页面,接着再『虚拟服务器』区域中单击『缺省服务』图标,进入『虚拟服务器选项』页面,如图 6-2-1 所示。

 
图 6-2-1 管理缺省服务
 
  现在单击『文档选项』按钮,进入该页面,在『用户WWW目录』中指定用户在自己的主目录(HOME)中存放 HTML 文件的目录,如图 6-2-2 所示。
 
图 6-2-2 用户文档根目录
 
  默认情况下,Apache 会为系统中的所有用户提供个人主页空间。如果你不想为某些用户提供个人主页空间,或者只希望某些特定的用户才能拥有个人主页空间,可以在『用户WWW目录』区域中分别选中『所有用户除了』或『Only users』单选框,然后单击随后的『...』按钮,打开『选择用户』窗口选择允许和拒绝拥有个人主页空间的用户,如图 6-2-3 所示。

 
图 6-2-3 只为特定的用户开辟个人主页
 
  这样,拥有个人主页空间的用户就可以在自己主目录(HOME)下的 public_html目录中,存放自己的 HTML 文件。作为管理员,可以事先为用户创建此目录,供他们今后旋转网页用。下面的命令可以为用户 kevin 创建这一目录,请注意为该目录赋予的权限:

 
  [root@kevin ~]#cd /home/
  [root@kevin home]#chmod 705 kevin (# 允许其它用户浏览)
  [root@kevin home]#cd kevin
  [root@kevin kevin]#mkdir public_html (# 用户文档根目录)
  [root@kevin kevin]#chmod 705 public_html (# 允许其它用户浏览)
  [root@kevin kevin]#chown kevin:kevin public_html

 
  如果需要为系统中的多个用户提供个人主页空间,可以在 /etc/skel/ 目录下建立一个 public_html 目录,这样在创建新用户时,其主目录下会自动生成一个名为 public_html 的目录。

 
  此后,用户 kevin 就可以在自己主目录下的 public_html 目录中,编写自己个人网站的 index.html 文件了,以下是 index.html 文件的代码:

 





Welcome to Gary's homepage!




 
  赶紧来测试一下吧。不过,测试在 www.mylinux.org 主机上 kevin 用户的个人主页,你需要在浏览器地址栏中输入 http://www.mylinux.org/~kevin/,如图6-2-4 所示。

 
图 6-2-4 测试个人主页
 
  如果 WWW 服务器的IP地址是动态分配的,可能不能从其它计算机上正确地访问到个人主页,此时只能在本机中使用 http://127.0.0.1/~kevin/ 或http://localhost/~kevin/ 的方式来进行测试。

 
  在设置个人主页时,关键是要允许其他用户有权浏览自己的主目录(HOME),同时在主目录下创建的 public_html 目录也要设置正确的权限,只有这样才能在浏览器中正确访问个人网站。如果不想将自己主目录下的其它目录暴露给别人,那就请将除 public_html 外的其它目录的访问权限都设置成700吧。

 
2、基于 IP 的虚拟主机

 
  虚拟主机(Virtual Host)指的是在一台 WWW 服务器上,将一台计算机虚拟成多个 WWW 服务器,同时为多个域名提供服务。

 
  举个例子,假设网络中一台 IP 地址为 218.168.100.2 的主机上安装了Apache 服务器,现在已经可以通过 http://www.mylinux.org 来访问这个网站。如果还想架设 www2.mylinux.org 和 www3.mylinux.org 两个网站,为了节省开支又不希望额外添置两台机器,就可以考虑把 www.mylinux.org、www2.mylinux.org 和www3.mylinux.org 三个网站都放到IP地址为 218.168.100.2 的主机上。

 
  其实实现的方法也很简单,那就是利用 Apache 的虚拟主机功能。

 
  对 ISP 来讲,虚拟主机绝对是一个节省费用的好办法。目前许多小企业由于种种条件的限制,通常是自用 ISP 维护的服务器来开发自己的网站。如果访问量不是很大,ISP 完全没有必要为每个客户提供一台单独的服务器,可以借助虚拟主机的功能,使 Apache 服务器为多个域名提供 WWW 服务,不同域名相互各不干扰,而对外则表现为多个不同的 WWW 服务器。

 
  Apache 提供了多种建立虚拟主机的方法,在 HTTP 协议的 1.0 及其以下版本中,各个虚拟主机必须使用不同的 IP 地址,这就是基于 IP 的虚拟主机的方式。建立基于 IP 的虚拟主机需要为每个虚拟主机配置不同的 IP 地址。一般是通过安装多块网卡,并为每块网卡分配一个 IP 地址来实现,但如果只有一块网卡呢?

 
  当然没有问题了,那就是使用 Linux 内核提供的 IP 别名功能。

 
  打开浏览器并登录 Webmin 后,单击『网络』图标进入网络管理页面,然后单击『网络配置』图标,在随后打开的『网络配置』页面中,可以对网卡进行配置。

 
  单击『网络接口』图标,进入『网络接口』页面。在『接口当前活动』区域中你可以看到所有当前活动的网络接口设置,而在『启动时启用接口』区域中则可以看到在系统启动时激活的所有网络接口设置。为 eth0 接口分配了 IP 地址218.168.100.2,现在看看如何将别名 218.168.100.12 分配给它,使得通过 IP 地址 218.168.100.2 和 218.168.100.12 都可以进行访问。

 
  在『启动时启动接口』区域中单击『eth0』链接,进入『编辑引导时接口』页面,『在虚拟接口』区域中可以为该网卡添加新的虚拟接口。通过添加虚拟接口,可以给虚拟接口分配其它 IP 地址。

 
  单击『增加虚拟接口』链接,进入『创建引导时接口』页面。首先在『名称』后面的文本框中输入虚拟接口的名称“0”,然后在『IP地址』文本框中输入要分配给该虚拟接口的IP地址“218.168.100.2”,『子网掩码』和『广播地址』当然必须得填了,最后单击『Create and Apply』按钮,新的虚拟网络接口就创建好了。

 
  返回到『网络接口』页面后,就可以在『接口当前活动』和『启动时启用接口』区域中找到新创建的虚拟接口。

 
  接下去就该为 IP 地址 218.168.100.12 分配域名 www2.mylinux.org。首先进入 Webmin『服务』管理页面,然后单击『BIND & DNS服务器』图标,在随后打开的『BIND & DNS服务器』页面中的『现有DNS区域』中找到 mylinux.org 域。

 
  单击『mylinux.org』图标,进入『编辑主区域』页面,此时的目标是要为 IP地址 218.168.100.12 添加一条地址记录(A)。

 
  单击『地址』图标,进入『地址记录』页面。在『增加地址记录』区域中的『名称』文本框中输入域名“WWW2”,并在『地址』文本框中输入 IP 地址“218.168.100.12”,然后单击『新建』按钮创建地址记录。

 
  创建好地址记录后,单击『地址记录』页面底部的『回到区域列表』链接,返回到『BIND & DNS服务器』页面。然后再单击『应用更改』按钮,重新加载 DNS 服务器,使新的设置生效。

 
  准备工作已经完成,现在可以设置 Apache 的虚拟主机了。Webmin 的『服务』→『Apache服务器』进入『Apache WEB 服务器』页面。在『创建新虚拟服务器』区域中的『地址』文本框中输入虚拟主机的 IP 地址“218.168.100.12”,并在『根文件』文件框中输入该网站的文档根目录“/var/www2/html”(该目录应该事先手工创建),而『服务器名称』文本框中则应输入虚拟主机的域名“www2.mylinux.org”,同时注意不要选择『增加名称虚拟服务器地址』复选框。最后,单击『新建』按钮创建该虚拟主机。

 
  虚拟主机成功创建后,在『Apache WEB 服务器』页面中的『虚拟服务器』区域中,可以找到新创建的虚拟主机所对应的图标,单击该图标可以进入『虚拟服务器』页面。如果已经熟悉了缺省服务器的配置,相信此时就难不倒你了。

 
  单击『联网和地址』图标,进入『联网和地址』页面,在『服务器管理员电子邮件地址』区域中,可以指定该网站管理员的 E-mail 地址。每个虚拟主机都可以单独拥有自己的管理员,设置好 E-mail 地址后,单击『保存』按钮即可。

 
  重新启动 Apache 服务器,然后在 /var/www2/html/ 目录下创建该网站的index.html 文件,index.html 文件代码如下:

 





Welcom to WWW2 site!




 
  现在就可以在浏览器中测试了。

 
3、基于域名的虚拟主机
 
  在采用基于 IP 地址的虚拟主机方式时有一个很明显的不足,那就是能够使用的 IP 地址有限,或者换句话说能够支持的虚拟主机数量有限。HTTP 协议的 1.1版本改进了这一缺点,可以用域名来区分各个虚拟站点,而不用为它们各自分配一个 IP 地址。使用同一个 IP 地址。可以建立多个虚拟站点,大大提高了 Apache服务器可以支持的虚拟主机数量,这就是基于域名的虚拟主机方式。

 
  在使用虚拟主机时,第一步仍是配置 DNS 服务器。假设要在 IP 地址为218.168.100.2 的机器上创建 www3.mylinux.org 这一虚拟主机。根据当前的 DNS配置,218.168.100.2 对应的域名是 www.mylinux.org,因此第一步工作是为 IP地址 218.168.100.2 分配新的域名 www3.mylinux.org。至于俱体的做法,还记得DNS 的别名记录(CN)吗?

 
  单击 Webmin 中的『服务』图标,进入服务管理页面,然后单击『BIND & DNS服务器』图标进入『BIND DNS服务器』页面,在现有 DNS 区域中找到mylinux.org,如图 6-2-5 所示。

 
图 6-2-5 管理 mylinux.org 域
 
  单击『mylinux.org』图标,进入『编辑主区域』页面,现在的目标是要为域名
www.mylinux.org 添加一个别名记录(CN),如图 6-2-6 所示。
 
图 6-2-6 别名记录
 
  单击『名称别名』图标,进入『名称别名』页面。在『增加名称别名记录』区域中的『名称』文本框中输入“WWW3”,并在『真名』文本框中输入真实的域名“WWW”,接着单击『新建』按钮创建别名记录,如图 6-2-7 所示。

 
图 6-2-7 新建别名记录
 
  创建好别名记录后,单击『名称别名记录』页面中的『当前模块首页』链接,返回到『BIND DNS服务器』页面,接着再单击页面底部的『应用更改』按钮,按照新的设置值重新启动 DNS 服务器,如图 6-2-8 所示。

 
图 6-2-8 重启 DNS 服务器
 
  现在可以在 Apache 服务器中创建虚拟主机了。首先单击 Webmin 的『服务』图标,进入服务管理页面,然后单击『Apache服务器』图标进入『Apache WEB 服务器』页面。在『创建新虚拟服务器』区域中的『地址』文本框中输入主机的 IP 址“218.168.100.2”,并在『根文件』文本框中输入该网站的文档根目录“/var/www3/html”,而『服务器名称』文本框中则应输入虚拟主机的域名“www3.mylinux.org”。在创建基于域名的虚拟主机时,关键是要将『增加名称虚拟服务器地址』复选框选中,如图 6-2-9 所示。这些参数都设置好后,单击『新建』按钮创建虚拟主机。

 
图 6-2-9 创建虚拟主机
 
  基于域名的虚拟主机成功创建之后,同样可能在『Apache WEB 服务器』页面的『虚拟服务器』区域中,找到新创建的虚拟主机所对应的图标。单击该图标后可以进入『虚拟服务器』页面,此时就可以用和缺省服务器相同的方法来对该虚拟服务器进行配置了。

 
  重新启动 Apache 服务器,然后在该网站的文档根目录 /var/www3/html/ 下建立 index.html 文件,index.html 代码如下:

 





Welcom to WWW3 site!




 
  大功告成,接着就可以在浏览器中测试一下了。

 
  成功后,再测试一下 www.mylinux.org。咦,显示的是 www3.mylinux.org 网站的首页,怎么搞的?不要着急,只要为 www.mylinux.org 创建一个虚拟主机就可以解决这个问题了。按照前面介绍的方法进入『Apache WEB 服务器』页面,然后在『创建新虚拟服务器』区域中的『地址』文本框中输入主机的IP地址“218.168.100.2”,并在『根文件』文本框中输入网站的文档根目录“/var/www/html”,至于『服务名称』文本框,当然是输入『服务器名称』文本框,当然是输入“www.mylinux.org”了。最后,单击『新建』按钮创建该虚拟主机。

 
  现在重新启动 Apache 服务器,然后再在浏览器中测试一下。

4、启动 Apache

  在 Webmin 中启动 Apache 服务器比较简单,『虚拟服务器选项』页面有『启动 Apache』链接,单击它就可以根据 httpd.conf 文件中的最新配置启动 Apache服务器了,如图 6-1-22 所示。
 
图 6-1-22 启动 Apache 服务器
 
  Apache 服务器启动后,如果又更改了 httpd.conf 文件,则可以单击『虚拟服务器』页面中的『应用更改』链接,请求 Apache 服务器重新加载新的配置值。此外,还可以单击『停止Apache』链接来关闭 Apache 服务器,如图 6-1-23 所示。
 

图 6-1-23 重新加载和关闭 Apache 服务器
 
  Apache 服务器已经正常启动了吗?只要用 ps 命令查看一下 Apache 服务器的后台服务进程 httpd 是否存在就可以了:

 
  [root@kevin ~]#ps -aux grep httpd (# 查看httpd进程)

  apache 20007 0.0 1.8 18140 7021 ? S 21:11 0:00 [httpd]...
 
  如果当前 Linux 系统是专门为 WWW 服务器使用的,那么将其设置成开机时自动启动是很必要的。在 Webmin 中单击『系统』图标,进入系统管理页面后再单击『引导和关机』图标打开服务列表页面,在列表中找到 httpd 服务,如图 6-1-24 所示。
 

图 6-1-24 管理 httpd 服务
 
  单击『httpd』链接,进入『编辑操作』页面。在『引导时启动』区域中选中『是』单选框,并单击『保存』按钮,就可以在系统启动时自动运行 Apache 服务器了,如图 6-1-25 所示。
 

图 6-1-25 开机自动启动 Apache
 
  大功告成,现在可以从网络中随便找一台客户机,来测试一下 Apache 服务器了。如果出现如图 6-1-26 所示的页面,则表明 Apache 服务已经正常工作了。
 

图 6-1-26 测试 Apache

Apache 管理主页面

  为了保证服务质量,Apache 服务器在提供 WWW 服务时,httpd 后台进程数目会随着访问量的改变而发生变化,这样做的好处是可以尽可能快地响应用户请求,但如果设置不当又会事与愿违。在『最大剩余服务器进程』区域中可以设置最大闲置服务器进程数,而在『最小剩余服务器进程数』区域中则可以指定最小闲置服务器进程数。所谓闲置服务器进程,指的是暂时还没有处理请求的 httpd 后台服务进程,Apache 会同期性地自动检查所有后台服务进程的状态,以调整闲置服务器进程的数目,使其始终在庙宇的范围之内。
 
  在『进程和限制』页面中的『初始服务器进程数』区域中,还可以指定在启动Apache 时,httpd 后台服务器进程的数目。这些限制参数都设置好后,就可以放心启动 Apache 服务器了,它绝不会因为连接的用户数目过多而导致性能的下降。
 
  设置好后,单击『保存』按钮返回到 Apache 管理主页面。
 
  Apache 很吸引人的一点是为用户提供了服务器和客户机之间的持久连接。具有持久性的连接可以加快数据的传送速度,以提高服务质量,因为不需要花时间为每个请求建立新的连接。
 
  单击『Apache WEB服务器』页面中的『联网和地址』图标,进入『联网和地址』页面。在『每个连接多个请求数』中可以为每次持久性连接指定请求的最大数目,而『保持活动超时』区域中的设置值则限制了持久性连接中连续两个请求之间的最大时间,如图 6-1-7 所示。一旦请求超过规定的时间仍没有响应,则 Apache 将结束这次持久性连接。
 

图 6-1-7 持久性连接设置
 
  在『联网和地址』页面的『请求超时』区域中,可以指定 Apache 服务器等待客户机的超时秒数。如果超过规定的时间 Apache 仍未收到或发送任何数据,那么已经建立的连接将被切断,这种做法可以最大限度地利用有限的资源,这也是Apache 性能如此优越的原因之一。
 
  下面来看看『联网和地址』页面中最重要的设置选项,那就是在『Listen onaddresses and ports』区域中指定的 Apache 监听端口,如图 6-1-8 所示。
 

图 6-1-8 监听的端口
 
  HTTP 协议使用 80 作为默认的通信端口,需要时也可以选用系统中其它尚未占用的端口,如 8080,那样就必须在浏览器中输入类似http://www.mylinux.org:8080 的 URL 来访问 WWW 服务器。如果『联网和地址』页面中的所有参数都设置好后,单击『保存』按钮返回到 Apache 管理主页面。
 
  在『Apache WEB服务器』页面中单击『用户和组』图标,进入『用户和组』页面,在这里可以指定 httpd 后台服务进程应该以哪一个用户和用户组的身份运行,如图 6-1-9 所示。
 

图 6-1-9 有效用户和用户组
 
  Apache 在启动时需要用 root 帐号来与小于 1024 的端口相结合,但占据端口之后 Apache 会立即将它的有效用户和组设为在这里指定的用户和组。从安全角度来讲,这是很重要的。在设置好 Apache 运行时的有效用户和组后,单击『保存』按钮返回 Apache 管理主页面。
 
  以上是 Apache 服务器中一些重要全局参数的设置,下面再看看缺省服务器的配置,估计这才是你真正感兴趣的。
 
  在『Apache WEB服务器』页面中单击『虚拟服务器』区域中的『缺省服务器』图标,进入『虚拟服务器选项』页面,如图 6-1-10 所示。

图 6-1-10 配置缺省服务器

  单击『联网和地址』图标,进入『联网和地址』页面。在『服务器管理员电子邮件地址』区域中可以指定 Apache 管理员的 E-mail 地址。此外,还可以在『服务器主机名』区域中设置 Apache 服务器的主机名,如图 6-1-11 所示。
 

图 6-1-11 管理员和主机名设置
 
  为 Apache 服务器设置的主机名应该是合法的 DNS 域名。否则,也可以用 IP地址代替,不设置主机名有时可能会导致 Apache 无法正常启动。设置好管理员的E-mail 地址和主机名后,单击『保存』按钮即可。
 
  一旦 Apache 在运行时产生故障,日志文件对管理员诊断问题时将变得非常重要。Apache 提供了非常完善的日志功能。单击『虚拟服务器』页面中的『日志文件』图标,进入『日志文件』页面,在『错误记录日志到』区域可以为 Apache 指定记录日志的文件,而在『Error log level』下拉框中则可以选择记录日志的等级,如图 6-1-12 所示。
 
图 6-1-12 日志文件
 
  浏览器请求资源时产生的错误,以及启动和关闭 httpd 进程时的信息,只要符合日志等级的规定,都会被仔细地记录在指定的日志文件中,供管理员需要时查看。

 
  Apache 服务器是按照固定式来记录日志信息的,在『缺省日志格式』区域中定义了 combined、common、referer 和 agent 四种缺省的日志格式。如果想以combined 格式来记录日志信息,可以在『访问日志文件』区域中的『格式』列中输入指定的格式,在『写入』列中选择『文件』单选框,同时在『文件或程序』列中输入日志文件的路径,如图 6-1-13 所示。这样 Apache 就会按照选定的格式将日志信息保存到指定的文件中关于日志格式的定义请参考 Apache 的联机帮助手册。设置好 Apache 的日志文件和格式后,单击『保存』按钮确定。

 
图 6-1-13 日志格式
 
  单击『虚拟服务器选项』页面中的『文档选项』图标,进入『文档选项』页面。在『文档根目录』中单击『...』按钮打开『选择目录』窗口来为 Apache 服务器指定网站的文档根目录,如图 6-1-14 所示。所有能够被浏览器访问的 HTML 页面都位于网站的文档根目录下。
 

图 6-1-14 文档根目录
 
  在 Apache 服务器中,为各个允许访问的目录赋予恰当的权限是管理员的一项重要职责,文档根目录下存放的是所有能被访问的 HTML 文件,其重要性自然勿庸置疑。在『文档选项』页面的『目录选项』区域中选择『已选择以下』单选框后,就可以在表格中为文档根目录赋予相应的权限了,如图 6-1-15 所示。

 
图 6-1-15 文档根目录选项
 
  为 Apache 服务器设置好根目录和权限后,别忘了单击『保存』保存设置。

 
  如果浏览器请求的资源不存在或发生错误时,为其返回一段错误信息是 WWW 服务器经常采用的一种做法。单击『虚拟服务器选项』页面中的『错误处理』图标,在『客户错误响应』列表中可以看到 Apache 服务器定义的所有错误处理方法,如图 6-1-16 所示。所有错误代码都是由 HTTP 协议规定的,管理员可以根据需要指定在错误产生时是跳转到某个 URL 地址,还是显示一段固定信息。比较常见的做法是将错误信息保存到某个 HTML 文件中,在产生相应的错误时就跳转到该文件。

 
图 6-1-16 客户错误响应
 
  看到这里你可能会有些迷惑:Apache 默认的错误处理方法都是在相应的错误产生时,直接显示 /error/ 目录下的某个文件,可系统中根本不存在 /error/ 这个目录啊。这是怎么回事呢?

 
  不要着急,首先单击『错误处理』页面底部的『保存』按钮,返回到『虚拟服务器选项』页面,接着单击『别名重定向』图标。相信当看到『文档目录别名』区域中的设置值时,就已经可以明白了。Apache 通过为目录 /var/www/error/ 设置一个别名 /error/,使得访问 /error/ 目录就等于访问 /var/www/error/ 目录,如图 6-1-17 所示。

 
图 6-1-17 文档目录别名
 
  在『别名和重定向』页面中,除了可以为文档目录设置别名外,还可以设置各种 URL 的重定向地址。设置完这些重定向地址后,单击页面底部的『保存』按钮返回『虚拟服务器选项』页面。

 
  通常 WWW 服务器返回的都是静态的 HTML 文档,但很多情况下可能需要根据浏览器发送请求时的条件来决定返回给浏览器的文档内容。设想一下网上聊天时的情况,WWW 服务器需要根据用户名,为同时在线的每个人显示各不相同的内容。通用风头接口 (Common Gateway Interface,CGI)是满足这类要求的一种传统方法,它定义了 WWW 服务器的由它执行的程序间共享信息的一种方法。

 
  说的白一些就是 WWW 服务器可以根据浏览器的请求,运行相应的 CGI 程序,而这个程序可以根据 WWW 服务器设置的各种环境变量、服务器磁盘文件中保存的相关信息,以及客户端的请求信息,来创建动态网页,并通过服务器返回给浏览器。

 
  在『虚拟服务器选项』页面单击『CGI程序』图标,进入该页面。在『CGI目录别名』区域中可以为 CGI 程序所在目录指定别名,如图 6-1-18 所示。

 
图 6-1-18 CGI 目录别名
 
  CGI 程序在运行时,最重要的是其依赖变量的当前值。在『CGI程序』页面的『变量集基于浏览器类型』区域中,可以根据客户端使用的浏览器来设置 CGI 变量的值。例如,在『浏览器正则表达式』中输入“Moxilla/2”,在『设置变量』中输入“nokeepalive”,并在『值』中输入“1”,如图 6-1-19 所示。这样就可以当客户端在使用 Moxilla/2 浏览器时将 CGI 变量 nokeepalive 的值设为1,从而能够保证对老版本浏览器的兼容,并支持新版本浏览器的一些新特性。

 
图 6-1-19 基于浏览器类型的 CGI 变量
 
  在『CGI程序』页面中,还可以根据实际需要设置 HTTP 方法对应的 CGI 动作、CGI 程序在执行时的环境变量,以及由 HTTP 请求中的头信息(header)所决定的CGI 变量值等等。在为 CGI 程序设置好这些参数后,单击页面底部的『保存』按钮保存设置信息。

 
  Apache 允许为每个目录指定默认显示的文件,或许平时你也局级注意到了,当我们在浏览器中输入一个网址(如http://www.mylinux.org)时,通常没有指定所要访问的文件名。在这种情况下 Apache 会将文档根目录下的默认文件显示出来。

 
  单击『虚拟服务器选项』页面中的『目录索引』图标,进入设置页面。在『目录索引文件』区域中可以指定目录中默认显示的文件名,如图 6-1-20 所示。还可以同时指定多个默认显示的文件是允许的,Apache 将会优先显示排在前面的文件。

 
图 6-1-20 默认显示的文件
 
  在『目录索引』页面中,还可以对其它目录索引选项进行设置,如是否显示图标,是否显示文件大小,各种类型的文件分别采用哪个图标表示等等。设置好目录索引的各种参数后,单击页面底部的『保存』按钮,重新返回到『虚拟服务器选项』页面。

 
  对于中文用户来说,Apache 服务器还有一个很重要的参数需要进行设置,那就是其默认的字符集类型。单击『虚拟服务器选项』页面中的『Language』图标,进入设置页面,然后在『Character set for documents』区域中输入“GB2312”,再单击『保存』按钮就可以将默认的字符集设置为中文,如图 6-1-21 所示。
 

图 6-1-21 默认字符集
 
  Apache 的配置也很有学问,深究起来会涉及很多方面,但上面的配置对一个普通的 WWW 服务器来讲已经绰绰有余了,你可以在实际应用的过程中慢慢地理解和掌握 Apache 的其它设置。

 
  好了,下面该动手启动 Apache 服务器了。