通过万维网访问信息

作者:Eric Kasten

在互联网上访问联网的多媒体数据已变得司空见惯。您很有可能为了某个项目或技术论文,或者仅仅出于好奇心而冲浪查找数据。您可能已经浏览了遍布全球的大量站点,并看到了可以完成的事情。现在您想要建立自己的信息、图像和声音集合,以便联网世界可以来访问。首要步骤之一是建立万维网 (WWW) 服务器。本文的其余部分将努力提供成功安装 CERN 提供的 WWW 服务器的必要信息。

准备和编译

CERN WWW 源代码包的三个基本部分是行模式客户端、守护进程和公共库。其中,守护进程和公共库源代码是编译服务器所必需的。您可能还想检索和编译客户端代码以供将来使用。这些软件包可以通过点击 URL www.w3.org/hypertext/WWW/Daemon/Status.html 文档中的相应链接来检索,或者通过匿名 ftp 从 gatekeeper.dec.com 的 /put/net/infosys/www/src 目录检索。文件名显示在下面的 tar 命令中。检索到 tar 存档后,将它们移动到您希望编译服务器的目录,然后解压源代码。使用 GNU 的 tar 可以通过执行以下命令来完成

tar xzvf WWWDaemon.tar.Z
tar xzvf WWWLibrary.tar.Z
tar xzvf WWWLineMode.tar.Z

最后一个文件和 tar 命令是可选的,因为它解压了行模式客户端。解压后,源代码将位于子目录 WWW 中。要在 Linux 下构建服务器,请更改到子目录 WWW 并执行 BUILD。操作如下

cd WWW
./BUILD

构建过程应该识别出它正在 Linux 系统上运行,并继续编译公共库,然后编译服务器。如果您没有解压行模式客户端的源代码,则构建过程将在服务器构建完成后退出并显示错误。这是正常的,可以忽略。您可以通过检查子目录 Daemon/linux 中的文件来验证您是否已成功构建服务器。除了许多 .o 文件之外,还应该有以下六个文件

  • cgiparse:一个用于解析 CGI 环境变量的工具。

  • cgiutils:一个用于从 CGI 脚本生成回复的工具。

  • htimage:用于解析来自可点击图像的输入。

  • httpd_3.0:服务器或守护进程。

  • httpd:指向 httpd_3.0 的符号链接

  • htadm:一个用于管理服务器访问文件的管理工具。

CGI 代表通用网关接口。CGI 是一组规范,用于说明脚本和其他程序如何与 WWW 服务器交互。

侧边栏:NCSA http 守护进程

基本安装

您可以将服务器和关联工具安装在您认为合适的任何目录中。本文假设安装目录为 /usr/local/WWW。如果您安装在其他目录中,请务必在以下引用中进行必要的更改。

要安装服务器列表,请为服务器创建一个用户 ID 和一个组。此用户 ID 和组将有助于控制服务器拥有的访问权限,并允许管理用户选择性地访问服务器文件。本文使用用户 www 和组 wwwgroup。可以使用您喜欢的方法将用户和组添加到系统中来创建它们。

接下来,创建服务器和关联工具及文件将驻留的目录树。典型的服务器目录将具有以下目录(以及可能的其他目录)

  • config:配置文件。

  • cgi-bin:CGI 脚本和程序。

  • icons:图标。

  • htdocs:HTML 文档。

要创建这些目录,请执行以下操作

mkdir /usr/local/WWW
cd /usr/local/WWW
mkdir config cgi-bin icons htdocs

现在可以填充这些目录。返回到您编译 WWW 服务器的目录,并执行以下操作

cd Daemon/linux
tar cf - htadm httpd httpd_3.0 | \
  (cd /usr/local/WWW; tar xvf -)
tar cf - htimage cgiparse cgiutils | \
  (cd /usr/local/WWW/cgi-bin; tar xvf -)
cd ../../server_root/icons
tar cf - * | (cd /usr/local/WWW/icons; tar xvf -)
cd ../config
tar cf - * | (cd /usr/local/WWW/config; tar xvf -)

此命令序列将服务器二进制文件、CGI 实用程序程序、提供的图标和几个示例服务器配置文件复制到 /usr/local/WWW 中的正确子目录。请注意 tar 的使用方式。这是一种常用的成功复制文件、链接和子目录的方法,而不会由于传递给 cp 的标志不当而在复制操作期间意外修改链接和其他特性。

您还应该设置此目录树的所有权和权限。以下是一组可能的权限

cd /usr/local
chown -R www.wwwgroup WWW
chmod a+rx WWW WWW/htdocs WWW/icons \
  WWW/cgi-bin WWW/config
chmod g+rx WWW/httpd_3.0
cd WWW/icons
chmod a+r *
cd ../cgi-bin
chmod a+rx *

这些是典型的权限,允许在请求文档或图标或需要执行 CGI 程序或脚本时访问服务器。但是,只要服务器以用户 www 和组 wwwgroup 身份运行(请参阅下面的 UserId 和 GroupId),就可以从大多数这些文件中删除 world 权限。

基本配置

/usr/local/WWW/config 目录包含几个示例配置文件。CERN 服务器具有丰富的选项集合,包括缓存规范、代理支持和访问控制。本文将仅介绍一组基本选项,以帮助您入门。

列表 1 是一个基本配置文件,您可以根据以下说明进行修改,以启动并运行您的服务器。此文件应在 /usr/local/WWW/config/ 中创建,并且可以具有您想要的任何名称;但是,这里将其称为 cern_httpd.conf。服务器启动时将搜索的默认文件名是 /etc/httpd.conf;但是,这很容易在命令行上被覆盖,或者您可以在 /usr/local/WWW/cern_httpd.conf 和 /etc/httpd.conf 之间创建符号链接。我更喜欢简单地覆盖默认值,从而清楚地表明当前正在使用的配置文件。

在检查列表 1 时,您会发现许多选项设置为不同的值。请注意,可以通过使用 shell 脚本约定,在第一列中放置 # 来向配置文件添加注释行。

# cern_httpd.conf
# An example httpd configuration file
ServerRoot /usr/local/WWW
HostName       wwwhost.my.domain.name
Port           80
PidFile        httpd-pid
UserId         www
GroupId        wwwgroup
AccessLog      /var/log/httpd.access
ErrorLog       /var/log/httpd.error
LogFormat      Common
LogTime        LocalTime
UserDir        public_html
Welcome        welcome.html
Welcome        index.html
AlwaysWelcome  On
#
# enable/disable methods
Enable         GET
Enable         HEAD
Enable         POST
Disable        DELETE
Disable        PUT
#
# Rules
Exec    /cgi-bin/*      /usr/local/WWW/cgi-bin/*
Pass    /*              /usr/local/WWW/htdocs/*

列表 1. WWW 配置文件

第一个配置选项之一是 ServerRoot。此选项确定服务器将用作默认根目录的目录。如果未指定绝对路径,则可以将其添加到其他选项设置(例如 PidFile)。在我们的例子中,ServerRoot 应设置为 /usr/local/WWW。

HostName 指令应设置为您的服务器将运行的主机的完全限定的、点分隔的主机名和域名。这是必要的,以便服务器可以正确地构造对自身的引用。此选项还可以用于指定要在构建 URL 时使用的主机名别名,而不是系统返回的主机名。

Port 指定服务器将接受连接的端口。当客户端(例如 Mosaic 或 Netscape)从您的服务器检索文档时,它将在此端口联系您的主机以发出请求。端口提供了一个固定的位置,用于访问主机上的特定服务。许多端口已被普遍定义为某些服务的接入点。您可以查看 /etc/services 文件以发现系统上保留的一些端口。如果您正在设置一个希望公众访问的 WWW 服务器,您可能应该使用端口 80。此端口已被确立为提供超文本传输协议 (http) 服务的默认端口。

PidFile 指令指定服务器应在其中记录主 httpd 服务器的进程 ID 的文件。此进程 ID 可用于帮助在您想要向其发送信号时定位服务器。指定的路径可以是绝对路径,也可以是相对于 ServerRoot 的路径。例如,将 PidFile 设置为 httpd-pid 将导致服务器将其进程 ID 记录在 ServerRoot 目录中的 httpd-pid 文件中。

接下来的选项是 UserIdGroupId。这些选项指定服务器将在其下执行的用户 ID 和组 ID。在本文中,如前所述,我将使用 www 作为用户,wwwgroup 作为服务器的组。

接下来是一组控制服务器将记录有关访问活动和错误的信息类型的选项。AccessLogErrorLog 应设置为有效的文件名。这些日志可能有助于深入了解调整或安全性。您可能希望将它们保存在 /var/log 中,或者专门为您的 WWW 服务器日志创建的目录中。LogFormat 应设置为 Common,从而指示一种日志记录格式,这种格式很可能被许多可用于帮助您处理日志信息的工具识别。LogTime 可以设置为 GMTLocalTime,具体取决于您希望如何对日志记录进行时间戳。

UserDir 指定每个用户的家目录下的公共 HTML 文档目录的名称。该示例指定 public_html 作为服务器应支持的目录。这意味着形式为 http://wwwhost.my.domain.name/~用户名 的通用资源定位符 (URL) 将重定向到 ~用户名/public_html/ 目录。然后,您系统上的每个用户都可以创建一个 public_html 目录,他们可以在其中设置自己的主页或其他公开可用的文档。

示例中有几个 Welcome 指令。Welcome 指示当 URL 传递到服务器时,如果路径仅指定目录,则应显示哪个文件。例如,使用示例配置文件,URL http://wwwhost.my.domain.name/docs/ 将导致从服务器上的 /usr/local/WWW/htdocs/docs/ 目录检索 Welcome.html、welcome.html 或 index.html。Welcome 指令在配置文件中出现的顺序决定了服务器用于查找欢迎文档的搜索顺序。只会显示找到的第一个文档。AlwaysWelcome 通常应设置为 on。如果此选项关闭,服务器将区分指定目录的 URL 是否带有尾部 /。如果此选项关闭,不带尾部 / 的 URL 目录将导致显示目录列表而不是欢迎文档。

EnableDisable 指令指定服务器上启用的方法。方法是在客户端-服务器会话期间可以执行的操作。例如,GET 方法允许从服务器检索文档,而 PUT 允许将文档写入服务器。默认情况下,GETHEADPOST 已启用,而 DELETE 和 PUT 已禁用。我更喜欢显式定义方法,以便清楚地控制我希望允许的访问。通常最好不要允许破坏性方法,例如 PUTDELETE,因为可能会意外允许对服务器的不安全访问,这可能会为入侵者提供进入您系统的方法。

我们的示例配置文件的最后一部分处理规则。规则用于控制传递到服务器的 URL 的处理。这些规则可以将 URL 字符串映射到特定文件或操作。在示例文件中,包含两个规则以简化 URL 构造并为 CGI 程序和脚本指定可执行路径。第一个规则是 Exec。此规则告诉服务器,包含字符串 /cgi-bin/ 的 URL 将导致在物理目录 /usr/local/WWW/cgi-bin/ 中执行 CGI 程序或脚本。Pass 指示一个规则,该规则导致所有以字符串 / 开头的 URL 都映射到目录 /usr/local/WWW/htdocs/。这是您应该放置服务器的公共 HTML 文档的目录。

默认欢迎文档

您可能希望拥有一个默认文档,当客户端访问您的服务器而未指定特定文档时,将显示该文档。例如,客户端可能使用形式为 http://wwwhost.my.domain.name/ 的 URL 连接到您的服务器。如果没有默认欢迎文档,将显示由 Pass 指令指定的目录的文件列表。然后,客户端可以使用正确的权限访问此目录中的任何文档。此外,请记住,如果文档位于 htdocs 目录中,则客户端可以通过在 URL 中显式命名该文件来访问它。只有您希望公开的文档才应该放在这里。

要为您的服务器创建默认欢迎页面,您只需在 /usr/local/WWW/htdocs 目录中使用您在服务器配置文件中使用 Welcome 指令指定的其中一个文件名创建一个欢迎文档。要设置一个简单的默认欢迎文档,请创建文件 /usr/local/WWW/htdocs/Welcome.html,其中包含以下文本,并将文件权限设置为全局可读 (chmod a+r)

<TITLE>Welcome!</TITLE>
Welcome to my WWW server!

这将显示一个标题为“欢迎!”的文档,并在正文中显示一条简单的欢迎消息。稍后,您可能希望向此文件添加更多有趣的信息,以及指向服务器提供的其他文档的链接。

测试和启动

现在服务器已准备好进行初始测试运行。您首先需要从终端连接以详细模式启动服务器,以便您可以检查任何配置错误。在终端中,输入以下内容

/usr/local/WWW/httpd -v -r /usr/local/WWW/config/cern_httpd.conf &

-v 标志指示服务器应以详细模式运行,-r 标志指定服务器配置文件。服务器将打印许多初始化消息和有关其启动时遇到的任何配置错误的消息。检查这些消息中是否有错误或差异。服务器完成启动处理后,您可以使用您喜欢的 WWW 浏览器使用以下形式的 URL 连接到它

http://wwwhost.my.domain.name/

如果一切顺利,您应该看到来自默认欢迎文档的消息。请务必检查服务器的输出是否有任何错误,并根据需要进行更正。

服务器可以在系统启动时从您的 rc 脚本之一(可能是 rc.local 或 rc.inet2)启动。它应该在网络初始化后启动。启动守护进程的一个好地方是用于启动 sendmail 或 inetd 的同一 rc 脚本。以下条目可用于启动 httpd 服务器守护进程,并在无法启动时警告您

# Start the CERN httpd server
if [ -x /usr/local/WWW/httpd ]; then
          echo -n ", httpd"
          /usr/local/WWW/httpd -r /usr/local/WWW/config/cern_httpd.conf &
else
          echo
          echo "=================="
          echo " httpd not found. "
          echo "=================="
fi

这是守护进程的独立启动。您也可以使用 inetd 启动服务器,但是从独立启动中您将获得更好的响应。inetd 的正确配置不在本文的范围内。如果您希望使用 inetd,请参阅 inetd 的 man 页面和文档,以及 CERN 文档的相关部分,网址为 www.w3.org/hypertext/WWW/Daemon/User/Installation/Inetd.htmlinetd 也在《Linux Journal》第 12 期的系统管理专栏中进行了介绍。

控制守护进程

httpd 守护进程接受各种类型的信号。其中两个最值得注意。KILL 信号将导致守护进程终止,可以使用以下命令发出

kill -KILL `cat /usr/local/WWW/httpd-pid`

killall -KILL httpd

有时您可能想要在不关闭守护进程的情况下重新配置它。这可以通过更改配置文件,然后向守护进程发出 HUP 信号来完成,如下所示

kill -HUP `cat /usr/local/WWW/httpd-pid`

killall -HUP httpd

与往常一样,请务必检查错误日志中是否有任何可能的配置错误。

用户主页

为了让用户创建主页,必须在用户的家目录中创建配置文件中 UserDir 指令指定的子目录(示例中为 public_html)。用户应将所有公开可用的文档放在此目录下。当服务器解析形式为 http://wwwhost.my.domain.name/~joe 的 URL 时,用户可能希望创建一个欢迎页面以进行展示。服务器将尝试解析这种形式的 URL,以引用 public_html 目录中的欢迎文档。如果找不到欢迎文档,则会向客户端显示目录列表。

为了让服务器正确访问用户的主页,必须设置用户家目录的权限,以允许服务器读取通过家目录进入 public_html 子目录。这可以通过将用户的家目录设置为具有全局执行权限 (chmod a+x) 来完成。public_html 目录必须设置为允许全局读取和执行 (chmod a+rx)。最后,public_html 目录中的文档应具有允许全局读取 (chmod a+r) 的权限。

用户主页位于其家目录的子目录中的替代方案是在 /usr/local/WWW/htdocs/ 下创建一个特殊的目录树。此目录树通常为每个将创建可通过 httpd 守护进程访问的公共文档的用户都有一个子目录。使用此安排,无需在用户的家目录上设置特殊权限,从而保持一些额外的安全性。如果实施此方法,则应省略示例中显示的 UserDir 指令。这将禁用对 http://wwwhost.my.domain.name/~用户名 形式的 URL 的支持。

例如,您可以创建 /usr/local/WWW/htdocs/home/ 目录。在此目录下,您可以为每个将创建公共文档的用户创建一个子目录。如果要允许用户自由修改目录内容,则必须相应地设置所有权和权限。还必须设置权限以允许服务器访问此目录。这通常意味着使目录全局可读 (chmod a+r)。然后可以使用诸如 http://wwwhost.my.domain.name/home/joe/ 之类的 URL 访问用户的主页。

您才刚刚开始...

此处介绍的内容旨在使基本服务器启动并运行。许多主题被省略,包括代理支持和特殊访问控制。CERN httpd 守护进程是一个非常灵活且可配置的 WWW 服务器。为了进一步研究,您可能需要浏览 CERN 在 www.w3.org/hypertext/WWW/Daemon/Status.html 提供的在线文档。

Eric Kasten 自 1989 年以来一直是一名系统程序员。目前,他正在密歇根州立大学攻读计算机科学硕士学位,其研究重点是网络和分布式系统。经过深思熟虑的意见和问题可以发送至 tigger@petroglyph.cl.msu.edu。您也可以访问他的主页 petroglyph.cl.msu.edu/~tigger/

加载 Disqus 评论