使用 Analog 进行 Web 分析
作为网站管理员的众多职责之一,是密切关注您网站的流量。当需要更新时,这些信息会很有帮助:您将知道哪些页面被请求最多,哪些页面可以多做一些推广。
Analog 是一个开源程序,它可以分析来自 Web 服务器的日志文件,创建多达 32 种不同的报告。它可以在包括 Linux 在内的多种操作系统上运行,并支持 35 种不同的语言。它非常灵活且快速。它的作者是 Stephen Turner,剑桥大学悉尼·苏塞克斯学院的研究员。他的研究与通信网络中的数学问题有关,因此他在日志文件分析方面具有良好的扎实背景。
Analog 的多功能性可能会使其看起来非常复杂;它有 200 多个配置选项。选择的数量也使其对主机管理员和网站管理员都非常有用。
analog-help 邮件列表上的一个常见问题是,“如何为虚拟主机设置 Analog?”。本文将介绍虚拟主机和单个页面的设置。此外,我还将描述如何使用配置文件和脚本文件来获取每月、每小时、每日和专门的报告。
我已经使用 Analog 好几年了,最初是在 FreeBSD 系统上;我是一个拨号客户,对我的个人网页感到好奇。后来,我在 Win95/98 上使用了 Analog,现在在一个 Linux 系统上作为 Web 管理员使用它。我的公开日志分析设置示例可以在 http://vcsweb.com/logs/ 找到。
Analog 是一种程序,由于选项众多,没有两个用户会以相同的方式使用它,因此只会讨论我经验的项目。
在深入研究 Analog 的配置文件之前,重要的是要了解您可以从日志文件中了解关于您网站的哪些信息以及哪些信息无法了解。首先,日志文件应仅被视为流量的估计。当从浏览器或 ISP 缓存文件访问网页时,日志引用不可用。根据 Analog 的作者所说,不可能知道不同访问者的数量或访问总数。
最根本的是,HTTP 是一种无状态协议。人们不会登录并检索多个文档:他们为他们想要的每个文件建立单独的连接。很多时候,他们的行为甚至不像登录到一个网站。因此,Analog 强调的是请求,而不是访问。
我们可以了解的内容各不相同,具体取决于 Web 服务器写入日志的内容。一般来说,这通常包括请求信息的计算机名称(或 IP 号码)、请求是针对页面(通常是 HTML 文档)还是另一种类型的文件、请求的状态、发出请求的时间和日期以及传输的字节数。如果日志文件报告了这些信息,我们还可以了解哪个网站或页面将访问者引导到我们的网站以及他们正在使用的浏览器。
Analog 的主页是 http://www.analog.cx/,可以从 www.analog.cx/analog4.01.tar.gz 下载。该网站还列出了该文件的几个镜像站点。
安装相当轻松:只需在 analog4.01 目录中键入 make 即可。在使用 make 命令之前,可以在 analhead.h 文件中设置几个选项,例如主机或组织名称、日志文件路径和名称;我发现使用配置文件来设置这些项目更实用。我在 analhead.h 中唯一需要更改的项目是将 /usr/local/etc/httpd 的目录路径更改为 /etc/httpd,以便它与我的 Red Hat Linux 系统匹配,这使我可以从 /etc/httpd/analog 目录中使用它。
应该注意的是,Analog 可以从任何目录运行,只要它可以找到其 /lang 目录。这可以通过将语言文件和路径名添加到 Analog 的配置文件中来实现,但就我的使用而言,将程序编译到我想工作的目录中更容易。当作为单个用户使用该程序时,您可以从您的主目录编译和使用它。
作为安装 Analog 的第二步,我强烈建议您在您最喜欢的 Web 浏览器中查看并添加本地 Analog 文档集的书签。如果您使用 Analog 创建 HTML 格式的报告,这将使您可以在一个浏览器窗口中打开文档,同时在另一个窗口中查看您生成的报告。Analog 不是那种您可以从头到尾阅读文档、创建一个配置文件然后退出的程序。相反,文档提供了关于其 200 多个命令中每一个的信息;您需要进行实验才能找到适合您偏好的设置。
Analog 可以配置为使用自定义的日志格式,如果您碰巧有由不同服务器创建的各种格式的日志文件,这是一件非常好的事情。即使我已经使用过许多不同的服务器,我仍然能够继续使用 Analog 来分析新的和旧的日志文件(不同的格式),方法是在给出日志文件的名称和路径之前列出日志格式的类型。我现在使用 Apache Web 服务器的组合日志格式,该格式生成一个通用日志文件,其中列出了引荐来源和浏览器信息以及每次访问的日志条目。否则,我将拥有单独的日志文件,一个用于引荐来源,另一个用于浏览器,并且在使用 Analog 的配置文件时需要包含这些日志文件。
如果您是主机管理员,您可以配置 Apache 为每个虚拟主机使用不同的日志文件。这使每个主机的信息保持独立,并使使用 Analog 分析您的虚拟主机日志文件更加直接。这是使用 Apache 的虚拟主机指令完成的
<VirtualHost vhost1.com> ServerAdmin webmaster@vhost1.com DocumentRoot /www/docs/vhhost1.com ServerName vhost1.com ErrorLog logs/vhost1.com-error_log CustomLog logs/vhost1.com-access_log combined </VirtualHost>
虽然您可以使用 Analog 和 analog.cfg 文件来告诉它做什么以及在哪里保存其报告,但如果您想为虚拟主机和单个页面创建不同的报告,最好使用多个配置文件。每个配置文件都有不同的用途,并且可以与包含 Analog 命令行开关的脚本文件结合使用。
在这种情况下,Analog 不是运行一次,而是运行多次;每次运行都会创建一个单独的报告。analog.cfg 文件仅包含与我们的主站点(而不是虚拟主机站点)相关的极少数基本命令。当为虚拟主机创建报告时,我使用 -G 命令行开关排除调用 analog.cfg。
基本安排类似于金字塔格式。所有主要项目都在 master.cfg 文件中,以涵盖我们系统上所有虚拟主机的广泛类别。仅与特定虚拟主机及其一般偏好相关的项目在下一层,最后,单个 page.cfg 文件在最后一个类别中。这使我可以根据需要创建专门的设置,并且仍然可以跟踪单个主机、站点和页面,而无需进行重大更改。
当为虚拟主机运行 Analog 时,首先调用 master.cfg 文件,然后调用 master-vhost.cfg(在命名文件时,我用主机的名称替换“vhost”),最后,调用单独页面的配置文件。此处包含一个示例 master.cfg 文件(请参阅列表 1)。
列表 2 中显示了一个示例 vhost.cfg 文件,正如您所看到的,它相当通用,因为大多数报告格式化等都由 master.cfg 文件处理。vhost.cfg 文件可用于为虚拟主机创建“总活动”报告。命令行提示符(或脚本文件)如下所示,为了清晰起见,没有路径:
analog -G +gmaster.cfg +gvhost1.cfg +Ovhost1-total.html
-G 告诉 Analog 不要使用 analog.cfg(仅用于主主机)。每当我们使用其他配置文件时,都会使用 +g:它和文件名之间没有空格。+O 指定输出文件名:它是字母 O,而不是数字零。
单个配置文件用于提供关于要包含在报告中的文件(使用 FILEINCLUDE 命令)的基本信息。HOSTNAME 和 HOSTURL 指令是在“Web 服务器统计信息”之后出现在每个报告顶部的项目。对于单个页面,我们使用页面的名称和 URL,而不是主机名或 URL。单个页面配置文件可以是三行或更多行,如列表 3 所示。
请注意,要使用的日志文件、输出文件和报告格式化命令未包含在内;这些项目在 master.cfg 文件中或在运行 Analog 时的脚本文件中设置。这使我可以在创建每日和每月报告时使用相同的信息,即使这两个报告非常不同。
FILEINCLUDE 命令使 Analog 搜索日志并检索仅与您指定的文件相关的数据。这是一个非常强大的命令,通常用于单个页面或站点的配置文件中。它也可以与通配符一起使用;如果我想包含 widgets 目录中的所有文件,我将使用
FILEINCLUDE http://vhost1.com/widgets/*
用于为此页面创建每日报告的命令行(全部在一行中),为了清晰起见,没有路径信息,如下所示:
analog -G +gmaster.cfg +gmaster-vhost1.cfg +gwidgets.cfg +Owidget.html
我每月向一些不在线的客户邮寄一份 Web 统计信息报告,他们发现每日报告太长,无法打印,并且编辑起来太费时间。为了解决这个问题并节省时间,我创建了 month-vhost.cfg 文件,这些文件创建 ASCII 文本格式的报告。month-vhost.cfg 文件与上面描述的单个配置文件结合使用。示例 month-vhost.cfg 文件如列表 4 所示。要生成每月文本报告,请在命令行上使用 +a 来指定 ASCII 输出
analog -G +gmonth-vhost1.cfg +gwidgets.cfg\ +Owidget.txt +a
由于我负责整个系统,因此查看总体情况(包括我们所有的主机)非常重要。为了实现这一点,我有一个单独的活动配置文件,并且每天使用 cron 条目运行一次 Analog。活动配置文件包括所有主机的日志文件,这需要向 Analog 提供额外的信息,以便它可以格式化结果;否则,/index.html 将被视为属于一个主机。配置文件中的命令必须在一行上。LOGFILE 命令允许您指定与日志文件对应的主机的名称(忽略换行)
LOGFILE /var/log/httpd/access_log http://main-isp.com/LOGFILE /var/log/httpd/vhost1.com-access_log http://vhost1.com
我们的每日报告发布在 Web 上,因此我更喜欢对 cgi-bin 信息保密。每日网站管理员电子邮件报告(如下所述)负责通知我与 Web 相关的漏洞利用,因此公共报告不需要这些信息。cgi-bin 目录和文件名需要被别名化,以便公众无法获得这些信息。Analog 可以使用输出别名来控制文件或目录在报告中的显示方式。如果需要,可以使用它来防止公众获取完整的路径和文件名。我在我的 master.cfg 文件中使用以下别名命令将 cgi-bin 路径和文件信息转换为简单的 admin(忽略换行)
REQOUTPUTALIAS */cgi-bin/* "admin" DIROUTPUTALIAS */cgi-bin/* "admin" FAILOUTPUTALIAS */cgi-bin/* "admin" FAILREFOUTPUTALIAS */cgi-bin/* "admin" TYPEOUTPUTALIAS */cgi-bin/* "admin" REFOUTPUTALIAS http://main-isp.com/cgi-bin/* "admin" REDIROUTPUTALIAS */cgi-bin/* "admin"
最后两个项目在虚拟主机 master.cfg 文件中使用,因此我们仍然不会在引荐报告中泄露关于其他本地主机的信息。如果您想更具体,您可以将文件名别名化以匹配它们的功能,例如以下行(忽略换行)
REQOUTPUTALIAS */cgi-bin/bannerpro.pl* "Banner Program"
我在一个全局目录中有很多部分页面,例如页脚、侧边栏和页眉,这些页面可能会导致 Analog 不成比例地夸大请求总数。当您排除信息时,它通常与整个主机有关,因此在 master.cfg 而不是在单个页面或站点配置文件中使用 exclude 命令是有意义的。要排除全局目录访问不计入请求,我使用以下命令
REQEXCLUDE */global/*
部分网页(例如页眉和页脚类型的文件)也可以使用 PAGEEXCLUDE 命令单独排除
PAGEEXCLUDE */footer.html或者(对于那些使用 PHP 的人)
PAGEEXCLUDE */footer.php3
我使用一个小脚本来接收每日网站管理员报告。这基本上与活动报告相同,但它包含公共版本中排除的信息。当我在早上阅读我的电子邮件时,我可以查看我的系统在过去 24 小时内的状态。该脚本从 cron 运行,由于如果没有列出 outfile,Analog 会将结果发送到 STDOUT,因此我利用了这一点。输出成为电子邮件的正文。基本网站管理员配置文件包含在列表 5 中。
使用脚本文件允许 Analog 连续创建多个报告。在配置文件之后,脚本文件是下一步。我使用一个每小时脚本来创建活动报告,以及两个每日脚本文件:一个用于发布在 Web 上的每日报告,另一个用于每天早上发送网站管理员电子邮件。每月脚本文件创建每月邮寄给客户的文本文件。这些脚本如列表 6-9 所示。
