Apache 服务器状态页面是否有可用的过滤器?

Apache 服务器状态页面是否有可用的过滤器?

我按模块启用了 Apache 状态页面mod_status。进程列表很长,其中大部分是OPTIONS * HTTP/1.0,我想将其过滤掉。

是否有任何调整、选项或标志可以隐藏这些OPTIONS进程?

答案1

除了重新编译mod_status以满足您的需要(这听起来可能有点过头了,但......它仍然可行),mod_status提供专为机器可读处理而设计的选项。根据官方文档

可以通过访问以下页面获取状态文件的机器可读版本http://your.server.name/server-status?auto. 这在自动运行 [...] 时很有用。

因此,捕获 mod_status 的输出非常简单,只需调用获得卷曲或任何其他可以在您的应用程序中启动/包含的 http 客户端库,以满足您的需要。

不幸的是,我刚刚发现,当使用“?自动”格式时,ExtendedStatus 指令不是显示!这意味着使用“?auto”选项,您无法访问进程列表。

由于听起来有点奇怪,我检查了mod_status模块。除了一个额外的和未记录的“?值得注意”选项外,源代码在“apache2-2.2.22/模块/生成器/mod_status.c“(我的 Ubuntu 12.04 LTS 笔记本)包括:

 * /server-status - Returns page using tables
 * /server-status?notable - Returns page for browsers without table support
 * /server-status?refresh - Returns page with 1 second refresh
 * /server-status?refresh=6 - Returns page with refresh every 6 seconds
 * /server-status?auto - Returns page with data for automatic parsing

(顺便说一句:我发现阅读“?notable - 返回不支持表格的浏览器的页面”既有趣又好奇,因为我太老了,不记得网络的早期,当时表格支持是一种新的可用浏览器的功能!)

我还检查了“?auto”格式中缺少的进程列表是一个设计特性:

#define STAT_OPT_AUTO     2
[...]
static const struct stat_opt status_options[] =
{
    {STAT_OPT_REFRESH, "refresh", "Refresh"},
    {STAT_OPT_NOTABLE, "notable", NULL},
    {STAT_OPT_AUTO, "auto", NULL},
    {STAT_OPT_END, NULL, NULL}
};
[...]
if (r->args) {
[...]
     case STAT_OPT_AUTO:
        ap_set_content_type(r, "text/plain; charset=ISO-8859-1");
        short_report = 1;
        break;
[...] 
if (short_report)
    ap_rputs("\n", r);
else {
    ap_rputs("</pre>\n", r);
    ap_rputs("<p>Scoreboard Key:<br />\n", r);
    [...lots of other things, including "processlist"...]
}
[...]

如您所见,您需要的内容位于最后一个“if”的“else”部分。因此,它不包含在“?auto”格式中,因为在这种情况下我们属于“short_report”情况。

因此,在了解完上述所有内容后,回到你的问题:“是否有任何调整、选项或标志可以隐藏这些 OPTIONS 进程?“,我的回答是,你唯一的选择就是“调整”一个小应用程序:

  1. 充当 HTTP 客户端/服务器状态标准网址;
  2. 解析结果以从 processlist HTML 表中提取数据;
  3. 跳过与 OPTION 请求相关的表行;
  4. 对其他行执行任何您需要的操作。

由于我对 PERL 很熟悉,并且对 HTML::表格提取模块,您可以使用的一个很好的基础如下:

#!/usr/bin/perl

use strict;

use HTML::TableExtract;

# PATH to "curl" utility
my $CURL = "/usr/bin/curl";

# URL of the server-status we want to process
my $STATUS_URL = "http://localhost/server-status";

# those are the headers in the first row of the table we want to extract
# Used by HTML::TableExtract to search for our table, within the whole HTML output
my $headers =['Srv','PID','Acc','M','CPU','SS','Req','Conn','Child','Slot','Client','VHost','Request'];


# Let's fetch the status page...
my $output = `$CURL -s $STATUS_URL`;

# Let's search for our table within the HTML...
my $tables = HTML::TableExtract->new( headers => $headers );

# We found it (hopefully), so let's parse it...
$tables->parse($output);

# ...and let's stick to the first one
my $status_table = $tables->first_table_found;

# Now let's loop allover the rows...
foreach my $row_ref ($status_table->rows) {
      # Let's de-reference the ARRAY reference, so to better manager
      # the various elements...
      my @row = @$row_ref;

      # Let's check for an OPTIONS row...
      if ($row[12]=~/OPTIONS/) {
         # simply skip to next row in the loop
         next;
      }

      # Let's choose whatever columns we want (first column has index "0")
      # So here we have Srv, PID, Client and Request
      foreach my $column (0,1,10,12) {
        print $row[$column]."|";
      }
      print "\n";
}

就我而言,上述脚本产生以下输出:

verzulli@tablet-damiano:~$ perl elab.pl 
0-1|9183|127.0.0.1|GET /server-status HTTP/1.1|
1-1|9184|127.0.0.1|GET /server-status HTTP/1.1|
2-1|9185|127.0.0.1|GET /server-status HTTP/1.1|
3-1|9186|127.0.0.1|GET /server-status HTTP/1.1|
4-1|9187|127.0.0.1|GET /server-status HTTP/1.1|
5-1|9188|127.0.0.1|GET /server-status HTTP/1.1|

您可以看到,跳过了 OPTIONS 行。

请注意,上述应用程序缺乏基本的错误处理,所以......如果出现问题,请不要怪我:-)

相关内容