我按模块启用了 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 进程?“,我的回答是,你唯一的选择就是“调整”一个小应用程序:
- 充当 HTTP 客户端/服务器状态标准网址;
- 解析结果以从 processlist HTML 表中提取数据;
- 跳过与 OPTION 请求相关的表行;
- 对其他行执行任何您需要的操作。
由于我对 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 行。
请注意,上述应用程序缺乏基本的错误处理,所以......如果出现问题,请不要怪我:-)