使用 Perl 进行 Web 客户端编程

作者:Robb Hill

许多 Linux 用户最初被该平台强大的 Web 服务器功能所吸引。在 Linux 平台上开发网站是一种非常令人满意的体验。在网站的设计和开发乐趣结束后,它将进入生产阶段。一旦投入生产,网站通常会有正常运行时间要求;为了确保满足这些要求,必须对网站进行监控。我使用一个监控系统,每天多次从许多网站请求页面。如果任何服务器未提供网页,则会重试。如果再次没有响应,我会通过寻呼机收到警报。使用此系统,我甚至可以在用户报告问题之前就对中断做出响应。只需少量的 Perl 和 Linux 即可实现此目的。

Linux 和 Perl 是 Web 服务器监控和警报设施的显而易见的选择。Linux 在平台中提供了稳定性和灵活性,而 Perl 使用 LWP 模块包(也称为 libwww),为处理 HTTP 请求提供了极好的方法。

我将解释如何编译/安装所需的组件,如何创建一个简单的 Perl 脚本来“HTTP ping”服务器(HTTPping.pl),如何使用 Perl 将页面发送到寻呼机,以及如何将所有这些组合成一个工业强度的网站监控解决方案(Monitor.pl)。

LWP

扩展 Perl 功能的模块的广泛可用性是该语言的优势之一。在获取网页的情况下,有几个模块可以使用。LWP 是明确的选择,因为它是一组很棒的模块,使 Perl 能够强大地控制 HTTP 和 HTML。在开始探索 LWP 以及如何使用它来监控网站之前,您必须安装它。

表 1。

LWP 模块依赖于其他几个模块。这些模块可能未安装在您的系统上。如果未安装,则必须下载并安装它们。表 1 包含我安装的确切版本,以及我安装它们的顺序。除了 SSLeay(稍后详细介绍),您可以从 CPAN(综合 Perl 存档网络)下载所有这些软件包。如果您是 Perl 新手,最好在 CPAN 上浏览一下。它包含大量 Perl 支持模块,可以节省大量的编程时间和成本。

下载 tar.gz 文件后,必须使用 tar 命令解压缩它们

tar -zxvpf MIME-Base64-2.11.tar.gz

这将解压缩和解包软件包。对所有存档执行此操作。完成后,您将拥有一个包含原始存档的目录和一个用于每个存档的新文件夹。每个文件夹都包含模块的安装程序;为每个软件包运行安装程序。再次以 MIME::Base64 模块为例,更改(使用 cd)到 HTML-Parser-2.22 目录并键入以下命令

perl Makefile.PL
make
make test
make install
这是安装 Perl 模块的典型方法。但是,软件包各不相同,您应始终阅读 README 或 INSTALL 文件以及任何模块随附的其他文档。
SSLeay

如果您计划 HTTP ping 使用 SSL(安全套接字层)的服务器,则必须编译并安装 SSLeay 和 Crypt-SSLeay。SSLeay 是一组程序,提供 SSL 所需的加密例程。Crypt-SSLeay 是 Perl 模块,充当 SSLeay 的包装器。我建议您阅读 SSLeay 随附的文档。如果您在编译时遇到任何问题,它将特别有帮助。

在解压缩 SSLeay-0.6.6b.tar.gz 存档的目录中执行以下命令以安装 SSLeay

./Configure linux-elf
make depend
make
make rehash
make test
make install

关于 SSLeay,有三件重要的事情是

  1. 不要尝试使用较新版本的 SSLeay。它们不适用于 Crypt-SSLeay 和 LWP 包。最后一个稳定版本是 SSLeay-0.6.6b.tar.gz。

  2. 其次,SSLeay 会泄漏内存。如果您选择使用 SSLeay 和 LWP 重复 HTTP ping 使用 SSL 的站点,您可能会遇到一些内存泄漏问题。通过从 Monitor.pl 调用 HTTPping.pl,脚本执行,ping 站点一次,然后终止;这减少了内存泄漏累积的可能性,从而导致您的应用程序崩溃。

  3. 由于 SSLeay 使用 RSA,您应该阅读 SSLeay FAQ(请参阅参考资料)以确定您是否可以合法使用 SSLeay 以及是否需要 RSA 的许可证。

创建 HTTP Ping 实用程序

HTTPPing.pl 向要监控的 Web 服务器发送 HEAD 请求。服务器通过仅发送 HTTP 标头来响应。如果您仅测试服务器是否启动,则只需知道这些就足够了。在开始 Web 客户端编程时,了解基本的 HTTP 方法 GET、POST 和 HEAD 是一个好主意。要了解 HEAD 命令的工作原理,我们可以使用 telnet 模拟浏览器。我在用于开发的机器上运行了一个 Web 服务器。如果您的本地机器上没有运行服务器,请将 localhost 替换为生产 Web 服务器的名称。

$ telnet www.cpan.org
80Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

键入以下内容,然后按“回车”两次

HEAD / HTTP/1.0
这是我的服务器返回的输出。
HTTP/1.1 200 OK
Date: Fri, 21 May 1999 03:18:26 GMT
Server: Apache/1.3.6 (Unix) (Red Hat/Linux)
Last Modified: Wed, 0 1999 21:17:54 GMT
ETag: "41803-799-370bcb82"
Accept-Ranges: bytes
Content-Length: 1945
Connection: close
Content-Type: text/html
此文本块包含请求文件的 HTTP 标头。可以使用 Perl 和 LWP 自动执行此操作,如清单 1 所示。

清单 1. HTTPPing.pl

脚本的第一行确定使用哪个解释器来运行脚本。如果 Perl 在系统中的位置不同,则需要相应地更改脚本。HTTPPing.pl 接受两个参数:要 HTTP ping 的 URL 和调试标志。这些参数被放入变量中。创建 LWP::UserAgentHTTP::Request 对象。请求传递给 UserAgent,并返回响应。检查响应以查看服务器是否已启动。如果站点已启动,则脚本以状态 1 退出;否则,它以状态 0 退出。可选地,由调试参数确定,站点的状态以冗长的方式声明为“up”或“down”。

要 ping 站点,请输入命令

$ perl HTTPPing.pl https:/// 1
https:// is up.

如果您有一个使用 SSL 以及用户名和密码的站点,则可以使用

$ perl
HTTPPing.pl https://username:password@localhost/ 1
https://username:password@localhost/ is up.
创建寻呼子例程

现在您可以 HTTP ping 您的站点,让我们看看如何发送警报页面。完成此操作后,您可以通过从作为服务运行的 Perl 脚本中同时调用 HTTPPing.pl 和 SendPage 子例程,将它们绑定在一起。

有几个选项可用于从 Perl 脚本发送页面:简单网络寻呼协议 (SNPP)、TAP(寻呼机字母数字协议)和专有寻呼接口。许多寻呼服务允许 SNPP 访问。此外,Perl 模块 Net::SNPP 可以使发送页面非常简单。

我的寻呼服务提供基于 Web 的寻呼界面。它是一个 HTML 表单,用于收集接收者的寻呼机 PIN 和消息,并将该信息以 POST 方式发送到我的寻呼服务提供商的 CGI 脚本。由于这是一个基于 Web 的界面,因此 LWP 是这项工作的自然选择。该表单需要发布三个值:命令类型、PIN 和消息。命令类型对于将页面发送到我的寻呼机类型是恒定的;其他两个值作为参数传入。

清单 2. 使用 Skytel 网站的 SendPage 子例程

请注意,请求对象允许您创建 POST 请求以及已经熟悉的 HEAD 请求。此子例程是我在 Monitor.pl 脚本中使用的子例程。大多数寻呼服务提供商都提供基于 Web 的寻呼服务(请参阅资源)。

或者,如果您的寻呼服务提供商允许您访问 SNPP 服务器,请考虑使用该协议。libnet 包的一部分是 Net::SNPP 模块。它是使用 SNPP (RFC 1861) 发送页面的绝佳工具。它还具有基于开放标准的吸引力。但是,某些 SNPP 服务器非常慢,以至于在很多情况下,上述方法会更胜一筹。使用 Net::SNPP 模块发送页面的方法如清单 3 所示。

清单 3. SNPP 服务器的 SendPage 子例程

将它们结合在一起

集成 HTTPPing.pl 和您选择的 SendPage 例程。Monitor.pl 以固定的时间间隔重复调用 HTTPPing.pl 脚本。如果 HTTPPing.pl 检测到站点已关闭,它会重试该站点以进行验证。如果站点被验证为已关闭,则会发送一个页面。发送页面后,Monitor.pl 继续向站点发送 HTTP ping。当站点恢复运行时,将发送另一个页面。

清单 4. Monitor.pl

下面是启动 Monitor.pl 的示例,给出要 ping 的 URL、寻呼机 pin 和延迟作为参数。最后一个参数是可选的调试标志,它将向您显示脚本内部正在发生的事情。

perl Monitor.pl https:// 1234567 120 120 1

一旦 Monitor.pl 启动,它将在您选择的时间间隔内耐心测试您的站点,只要您愿意。在系统启动期间启动此类脚本是一个好主意。

在系统启动时启动 Monitor.pl

将 HTTPPing.pl 和 Monitor.pl 复制到 /bin 目录,并更改其权限以使其可执行。这允许系统在系统启动时运行它们。

chmod +x Monitor.pl
chmod +x HTTPping.pl

您可以在系统启动时启动 Monitor.pl 脚本,方法是利用每次系统启动时运行的特殊脚本。/etc/rc.d/rc.local 脚本在所有服务启动后由系统运行。通过将以下行添加到 rc.local 文件的末尾,Monitor.pl 将在启动时启动。

Monitor.pl https:// 1234567 120 120 0 &
然后使用诸如 tksysv 之类的工具将其添加到您希望它在其中启动的运行级别。在我的系统上,我启动到运行级别 3,因此我将其添加到运行级别 3 中要启动的程序列表中。这通过启用在启动时启动监控脚本,使监控站更加强大。有关 init 和服务的良好介绍,请参阅 Linux Journal 第 55 期。
结论

Linux 的可靠服务器性能以及 LWP 包和 Perl 丰富且易于使用的功能,将使扩展 HTTPPing.pl 和 Monitor.pl 以执行更复杂的 Web 服务器检查变得非常容易。您可以处理 cookie 并定期执行模拟用户输入到表单中以测试应用程序。使用 LWP 模块,HTTP 客户端编程的可能性是无限的。

资源

Web Client Programming Using Perl
Robb Hill 是美国红十字会国家总部的资深网站管理员,他负责公共和 Intranet Web 服务器的技术方面。如果您有任何疑问,可以通过 vortextube@earthlink.net 与他联系。
加载 Disqus 评论