原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://coolerfeng.blog.51cto.com/133059/47635

今天配置nagios的时候遇到了一些麻烦.前面的步骤都一切顺利,但是修改好所有的cfg后,点击左边的菜单时总是提示Internal Server Error错误.错误如下:

Internal Server Error


The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.

--------------------------------------------------------------------------------
Apache/2.0.52 (CentOS) Server at mail1.chinabank.com.cn Port 80
红色的提示告诉我们这个错误来自apache.检查apache的错误日志.
vi /var/log/httpd/error_log
Premature end of script headers: status.cgi, referer:[url]http://mail1.chinabank.com.cn/nagios/side.html[/url]
大意是不完整的HTTP头.不太懂这个什么意思.重新编译了一个apache在/usr/local/apache/然后停掉原来的httpd,启动新编译的apache,发现nagios的页面可以正常显示,看来是系统自带的apache的配置有问题.google之,网上的解释是apache启用了suexec的功能.对CGI的执行路径进行了限制.那么检查一下本机的apache是不是打开了suexec功能呢.
[root@mail2 ~]# httpd -V
Server version: Apache/2.0.52
Server built:   Jul 14 2007 11:53:18
Server's Module Magic Number: 20020903:9
Architecture:   32-bit
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
看来是启用了suexec.
运行suexec -V
可以看到
[root@mail2 nagios]# suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"
看来cgi程序只能在/var/www目录下执行.打开/var/log/httpd/suexec.log
command not in docroot (/usr/local/nagios/sbin/status.cgi)
因为我的nagios默认安装在/usr/local/nagios
所以这个cgi不允许被执行.
解决办法.把nagios安装到/var/www/nagios就可以了
之前我尝试过编译nagios的时候指定--with-cgidir=/var/www/cgi-bin但是发现编译好的nagios的sbin依然在/usr/local/nagios目录下.
编译的时候指定--prefix=/var/www/nagios,其他编译安装的选项不变.
如果不想重新编译,也可以把原来安装到/usr/local目录下的
nagios移动到/var/www目录下.再修改相关的配置文件.这个工程比较大.建议还是重新编译.nagios目录下的etc目录里面的所有cfg的路径都要改.可以用vi的替换功能.
编译好以后.重启nagios和apache(每次进行某服务的配置文件改动后,都重启该服务,使修改生效)
再次刷新nagios的页面.还是一样的错误.
查看/var/log/httpd/suexec.log
directory is writable by others: (/var/www/nagios/sbin)
目录不能有写权限,修改如下:
chmod -R 755 /var/www/nagios/sbin
再刷新页面,日志中又出现
target uid/gid (1000/1000) mismatch with directory (1001/1001) or program (1001/1001)
apache的运行用户和nagios的sbin目录的属主不匹配.
chown -R vuser.vgroup /var/www/nagios/sbin
现在好了
如果不修改sbin的属主,也可以切换apache的运行用户.在httpd.conf中添加如下内容(添加红色部分)
<VirtualHost *:80>
SuexecUserGroup nagios nagios
ScriptAlias /nagios/cgi-bin "/var/www/nagios/sbin"
<Directory "/var/www/nagios/sbin">
#  SSLRequireSSL
  Options ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
#  Order deny,allow
#  Deny from all
#  Allow from 127.0.0.1
  AuthName "Nagios Access"
  AuthType Basic
  AuthUserFile /var/www/nagios/etc/htpasswd.users
  Require valid-user
</Directory>
Alias /nagios "/var/www/nagios/share"
<Directory "/var/www/nagios/share">
#  SSLRequireSSL
  Options None
  AllowOverride None
  Order allow,deny
  Allow from all
#  Order deny,allow
#  Deny from all
#  Allow from 127.0.0.1
  AuthName "Nagios Access"
  AuthType Basic
  AuthUserFile /var/www/nagios/etc/htpasswd.users
  Require valid-user
</Directory>
</VirtualHost>
这里一定要用VirtualHost定义一个虚拟主机,否则SuexecUserGroup nagios nagios
这条语句不起作用
然后我们重启apache,呵呵,总算可以访问nagios的监控界面了
接下来的工作就是完善nagios的监控功能.
总结:遇到问题后.首先应该分析是什么问题,然后查找对应的日志,从日志中寻找问题的所在,对于不能理解的日志内容,可以google上查找答案.但是最后的解决方案还是得自己摸索.

本文出自 “风吹云动” 博客,请务必保留此出处http://coolerfeng.blog.51cto.com/133059/47635