以下是我单击任何服务/主机扩展信息时的屏幕截图:
顶部的奇怪信息:
该行的内容以此开头__gmon_start_libc.so...
:
__gmon_start__libc.so.6fflushstrcpy__rawmemchrgmtime_rexitreaddirfopenstrrchr__strdupclosedirstrncpyputsputcharreallocstdinstrpbrklocaltime_rgmtimestrtokmmapfgetscallocstrlenmemsetstrstr__errno_locationstdoutmemcpyfcloserand__strtol_internalmallocstrcatstrcasecmpasprintfopendirgetenvsscanfsystemmunmapstrncasecmp__fxstatstrncatfreadlocaltimestrchrmktimeqsort__strtod_internal__ctype_toupper_loc__ctype_tolower_loc__xstatstrcmpstrerror__libc_start_mainsnprintf__strtoul_internalfreeGLIBC_2.3GLIBC_2.2.5
底部的菜单格式很差:
单击任何服务命令,它会响应“400 错误请求”错误。
Apache中的配置:
<VirtualHost *:80>
ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
ServerName xx
ErrorLog logs/nagios.error_log
<Directory "/usr/local/nagios/sbin">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Alias /nagios "/usr/local/nagios/share"
<Directory "/usr/local/nagios/share">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Apache 的错误日志中没有与此相关的内容。
我已更新到最新版本3.3.1:
nagios -v
Nagios Core 3.3.1
Copyright (c) 2009-2011 Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 07-25-2011
License: GPL
但它仍然存在。
的许可extinfo.cgi
:
-rwxrwxr-x 1 nagios nagios 285528 Sep 15 17:52 extinfo.cgi
为了调试这个案例我应该首先看什么?
更新
我已向ScriptLog
nagios 虚拟主机添加了指令:
ScriptLog logs/cgi_log
该文件已创建并chmod
手动:
-rw-r--r-- 1 apache apache 0 Sep 20 11:46 /var/log/httpd/cgi_log
转到浏览器复制此错误,但日志为空。有人有其他想法吗?
更新2
这里extinfo.cgi
是以用户身份从命令行运行时的输出apache
:
# REQUEST_METHOD=GET QUERY_STRING="?type=2&host=149&service=Disk_Free" REMOTE_USER="quanta" ./extinfo.cgi
更新 3
您提到其他正在运行的 CGI,它们也被称为 .cgi 吗?
当然。所有剩余的 .cgi 脚本都/usr/local/nagios/sbin/
可以正常工作。例如status.cgi
:
您配置 ScriptLog 的方式应该是打印信息。
但事实并非如此。这个日志文件是空白的。
-rw-r--r-- 1 apache apache 0 Sep 20 11:46 /var/log/httpd/cgi_log
看起来您已为此目录关闭了 AllowOverride,但也许 apache 配置允许将其用于其他更高级别的目录?在这种情况下,请确保您没有禁用 ExecCGI 或在 nginx sbin 上方的任何目录中没有任何 .htaccess 文件。
中没有.htaccess
文件/usr/local/nagios
。我还将此配置与另一个可以运行的文件进行了比较,没有明显差异:
ScriptAlias /nagios/cgi-bin "/usr/lib64/nagios/cgi"
<Directory "/usr/lib64/nagios/cgi">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /etc/nagios/htpasswd.users
Require valid-user
</Directory>
Alias /nagios "/usr/share/nagios"
<Directory "/usr/share/nagios">
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /etc/nagios/htpasswd.users
Require valid-user
</Directory>
如果这不起作用我会增加 apache 日志级别:
我这样做了,但是错误日志中没有任何与 cgi 相关的内容:
proxy_util.c(1873): proxy: worker proxy:reverse already initialized
proxy_util.c(1967): proxy: initialized single connection worker 0 in child 3586 for (*)
proxy_util.c(1854): proxy: grabbed scoreboard slot 0 in child 3587 for worker proxy:revers
proxy_util.c(1873): proxy: worker proxy:reverse already initialized
proxy_util.c(1967): proxy: initialized single connection worker 0 in child 3587 for (*)
如果这些都不能指出问题所在,我可能会在将 apache 设置为仅运行一个子进程并查看工作 CGI 与非工作 CGI 的输出后对其进行 strace 操作,以查看问题所在。
说得好。我在这里附上了 strace 文件。
仅跟踪打开的文件:
strace -e trace=open -o /tmp/*.strace /usr/sbin/httpd -X
extinfo.cgi
(无效):http://pastebin.com/PKggyzfKstatus.cgi
(作品):http://pastebin.com/Gg6WwntJ
跟踪已满:
strace -o /tmp/*.strace /usr/sbin/httpd -X
extinfo.cgi
:http://www.mediafire.com/?c0du4p55pn7oh76status.cgi
:http://www.mediafire.com/?1atvyecswmbv0sy
看看你是否能帮忙。
答案1
如果您重命名extinfo.cgi
,它会以另一个名称运行吗?如果脚本在重命名后执行,很可能您的 Apache 配置的某些部分extinfo.cgi
以某种非预期的方式处理该名称。例如,/etc/httpd/conf.d/satisfy.conf
您有:
<LocationMatch "/info(1|2).php">
此部分实际上将应用于所有包含匹配部分的请求任何地方在 URL 中(因为正则表达式模式未固定)。例如,它将适用于/info1.php
、/some/dir/info2.php
、/dir/info1_php_anything/and/more
(请注意,正则表达式中的点可匹配任何字符,您需要写入\.
以匹配文字点)。此外,Location
和LocationMatch
部分始终在最后一步应用并覆盖其他所有内容(.htaccess
、Directory
、Files
),并且VirtualHost
定义之外的部分将应用于所有虚拟主机。
如果您的配置文件包含其他类似的混乱LocationMatch
模式,也许其中一些会匹配/nagios/cgi-bin/extinfo.cgi
并破坏针对该特定脚本名称的 CGI 处理。
答案2
这脚本别名指令由mod_alias,但标有该指令的目录中的文件将由mod_cgi。
检查您的mod_cgi已正确加载。
答案3
我非常确信这是一个配置问题,可能与 AddHandler 有关。正如 @Vladimir Blaskov 指出的那样,您提供的输出表明 apache 不认为这是一个 cgi。您提到了其他正在运行的 CGI,它们也被称为 .cgi 吗?或者它们只是在允许没有后缀的 ExecCGI 的目录中?另请参阅文档:
http://httpd.apache.org/docs/current/mod/mod_cgi.html
http://httpd.apache.org/docs/2.0/howto/cgi.html#configuring
您配置 ScriptLog 的方式应该是打印信息。如果我处于您的情况,我会检查以下几点:
确保您有一个有效的 AddHandler:
http://httpd.apache.org/docs/current/mod/mod_mime.html#addhandler
对于 .cgi,或者测试其他 .cgi 是否在与 extinfo.cgi 相同的目录中运行。
看起来您已为此目录关闭了 AllowOverride,但也许 apache 配置允许将其用于其他更高级别的目录?在这种情况下,请确保您没有禁用 ExecCGI 或在 nginx sbin 上方的任何目录中没有任何 .htaccess 文件。
如果这不起作用我会增加 apache 日志级别:
http://httpd.apache.org/docs/2.0/mod/core.html#loglevel
LogLevel debug
然后查看是否打印任何与该文件或目录未作为 CGI 处理的原因相关的内容。
如果以上方法都不能指出问题所在,我可能会将 apache 设置为仅运行一个子进程,然后查看工作 CGI 与非工作 CGI 的输出,以查看问题所在。这种测试可能会暴露日志记录是否存在配置问题,导致 apache 无法向 CGI 日志中写入有用的消息,告诉我们它拒绝运行的原因。希望您在修复之前不要一直到这一部分,如果您这样做了,我会非常好奇诊断结果显示了什么。