opendaemonsocket: daemon MTA: cannot bind: Address already in use

启动nagios、启动sendmail测试nagios发信,通过监控maillog日志发现始终没有发信信息,并且得到错误提示:
sendmail[28180]: NOQUEUE: SYSERR(root): opendaemonsocket: daemon MTA: cannot bind: Address already in use
sendmail[28180]: daemon MTA: problem creating SMTP socket
查资料说是和postfix冲突,查看postfix服务状态,果然postfix启动了,果断停掉。重新启动一下sendmail。重新测试nagios检测服务停止发信功能。正常···

Error: Could not open command file ‘/usr/local/nagios/var/rw/nagios.cmd’ for update!

Error: Could not open command file ‘/usr/local/nagios/var/rw/nagios.cmd’ for update!

出现这个问题,一般是apache服务运行的账户对nagios.cmd没有权限。所以导致报错。
常见的解决办法是直接修改nagios.cmd的文件权限,直接改为777,问题即可解决。
但是在下次重新启动nagios服务时,此文件权限会又会变为原先的权限。
prw-rw—-. 1 nagios nagios 0 May 9 23:13 nagios.cmd

解决办法1:
修改apache的运行账户为nagios账户。这个nagios账户就是运行nagios服务的账户,一般我们会用”nagios”用户来运行。
但是这样可能会对apache有某种程度影响。如果是本机单纯跑nagios监控那就无所谓了。
解决办法2:
将naigos的运行账户改为apache的运行账户。
上面两种方法总结一句话就是apache和nagios的运行账户必须是同一个

由于实际环境限制,它俩又不能用同一个账户,我采用下面方法。
解决方法3:
在nagios启动脚本上下手。
[root@localhost ~]# vi /etc/rc.d/init.d/nagios #截取其中一部分

case "$1" in

 start)
 echo -n "Starting nagios:"
 $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
 if [ $? -eq 0 ]; then
 su - $NagiosUser -c "touch $NagiosVarDir/nagios.log $NagiosRetentionFile"
 rm -f $NagiosCommandFile
 touch $NagiosRunFile
 chown $NagiosUser:$NagiosGroup $NagiosRunFile
 $NagiosBin -d $NagiosCfgFile
 if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi
 echo " done."
 chmod 777 /usr/local/nagios/var/rw/nagios.cmd
 exit 0
 else
 echo "CONFIG ERROR! Start aborted. Check your Nagios configuration."
 exit 1
 fi
 ;;

在 echo ” done.”(13行)下面添加一句chmod 777 /usr/local/nagios/var/rw/nagios.cmd
目的就是为了启动nagios的时候顺便执行一下修改权限。
另外还需要修改restart)部分 (重启nagios),这里第三种方式我认为最方便。
这样一来支持执行 service nagios start/restart 时就可以自动修改文件权限。

ssh端口修改后nagios监控ssh服务

ssh端口修改后nagios监控ssh服务

nagios默认监控ssh的端口是22,这个是无疑的,为了安全我们可能会修改ssh的默认端口,这样一样nagios就无法正常监控了。
现在就需要修改监控主机的配置文件。
我们可能不了解nagios插件的参数,不过可以通过如下方式查看:
[root@localhost ~]# cd /usr/local/nagios/libexec/ #进入nagios插件目录

[root@localhost libexec]# ./check_ssh #直接执行二进制文件,有的是shell脚本
check_ssh: Could not parse arguments
Usage:
check_ssh [-4|-6] [-t <timeout>] [-r <remote version>] [-p <port>] <host>
[root@localhost libexec]# ./check_http
check_http: Could not parse arguments
Usage:
 check_http -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]
 [-J <client certificate file>] [-K <private key>]
 [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-E] [-a auth]
 [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>]
 [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]
 [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]
 [-A string] [-k string] [-S <version>] [--sni] [-C <warn_age>[,<crit_age>]]
 [-T <content-type>] [-j method]

根据提示可以看到插件支持的参数,那么这里ssh的就需要-p指定端口号。
比如我现在监控本机,直接修改localhost.cfg

define service{
 use local-service ; Name of service template to use
 host_name localhost
 service_description SSH
 check_command check_ssh! -p 1122
 notifications_enabled 0
 }

nagios下,命令与参数之间通过叹号!来分开。

define service{
 use local-service ; Name of service template to use
 host_name localhost
 service_description HTTP
 check_command check_http! -p 8080 #也可以用check_tcp!8080这种方法
 notifications_enabled 0
 }

Error: Could not stat() command file ‘/usr/local/nagios/var/rw/nagios.cmd’!

外部命令文件无法stat()。
外部文件不存在,或Nagios未运行、Nagios不支持外部命令。
提交命令时出错

在服务中启用服务通知 Enable notifications for this service 提交的时候报错。
Error: Could not stat() command file ‘/usr/local/nagios/var/rw/nagios.cmd’!
The external command file may be missing, Nagios may not be running, and/or Nagios may not be checking external commands.
An error occurred while attempting to commit your command for processing.

根据错误提示到/usr/local/nagios/var/rw下发现没有nagios.cmd文件。不知道为啥···

解决办法:
[root@localhost ~]# cd /usr/local/nagios/var/rw
[root@localhost rw]# mkfifo nagios.cmd
[root@localhost rw]# chmod o+w nagios.cmd
[root@localhost rw]# chmod g+w nagios.cmd
[root@localhost rw]# ll nagios.cmd
prw-rw—- 1 nagios nagios 0 May 9 09:08 nagios.cmd
[root@localhost ~]# service nagios restart

FIFO是一种特殊的文件类型,它允许独立的进程通讯.
一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行。

linux监控工具nagios之安装篇

关于nagios的介绍不做过多的描述,下面开始安装过程。
nagios的官方网站:http://www.nagios.org
目前最新版为4.0.6,这里我不用最新版本,采用nagios-3.5.1。
下载地址:http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.5.1.tar.gz
nagios插件下载地址:http://nagios-plugins.org/download/nagios-plugins-2.0.tar.gz
nagios汉化插件下载地址:http://nchc.dl.sourceforge.net/project/nagios-cn/sourcecode/zh_CN%203.2.3/nagios-cn-3.2.3.tar.bz2
nagios需要web服务器和php支持,所以安装Apache(或nginx)+php,mysql到用不上顺便装上留作其它测试用。

安装:

[root@centos-6.5-x64 ~]#useradd -s /sbin/nologin nagios
[root@centos-6.5-x64 ~]#yum install -y gcc gcc-c++ gd gd-devel openssl openssl-devel zlib zlib-devel httpd php php-mysql php-gd php-mbstring mysql mysql-server sendmail
[root@centos-6.5-x64 ~]#tar zxvf nagios-3.5.1.tar.gz
[root@centos-6.5-x64 ~]#cd nagios
[root@centos-6.5-x64 nagios]#./configure --prefix=/usr/local/nagios --with-gd-lib=/usr/lib --with-gd-inc=/usr/include/
[root@centos-6.5-x64 nagios]#make all
[root@centos-6.5-x64 nagios]#make install
[root@centos-6.5-x64 nagios]#make install-init #在/etc/rc.d/init.d目录下创建nagios启动脚本就可以通过service nagios start···管理
[root@centos-6.5-x64 nagios]#make install-commandmode #自动设置相关目录的权限
[root@centos-6.5-x64 nagios]#make install-config #安装nagios配置文件模板

安装nagios插件:

[root@centos-6.5-x64 ~]#tar zxvf nagios-plugins-2.0.tar.gz
[root@centos-6.5-x64 ~]#cd nagios-plugins-2.0
[root@centos-6.5-x64 nagios-plugins-2.0]#./configure --prefix=/usr/local/nagios/
[root@centos-6.5-x64 nagios-plugins-2.0]#make all
[root@centos-6.5-x64 nagios-plugins-2.0]#make install

插件被安装到/usr/local/nagios/libexec/下

安装中文插件:
对于像我这样渣渣英语的同学来说安装个汉化插件不错。

[root@centos-6.5-x64 ~]#tar jxvf nagios-cn-3.2.3.tar.bz2
[root@centos-6.5-x64 ~]#cd nagios-cn-3.2.3
[root@centos-6.5-x64 nagios-cn-3.2.3]#./configure
[root@centos-6.5-x64 nagios-cn-3.2.3]#make all
[root@centos-6.5-x64 nagios-cn-3.2.3]#make install

配置apache:
[root@centos-6.5-x64 ~]#vi /etc/httpd/conf/httpd.conf
User nagios #运行apache的用户、组改为nagios
Group nagios
DirectoryIndex index.php index.html index.html.var
直接跳到最后一行追加:

ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
<Directory "/usr/local/nagios/sbin">
AuthType Basic
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthUserFile /usr/local/nagios/etc/htpasswd #指定密码文件
Require valid-user
</Directory>

ServerName localhost

Alias /nagios "/usr/local/nagios/share"
<Directory "/usr/local/nagios/share">
AuthType Basic
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user
</Directory>

因为nagios没有自带用户认证功能,所以通过apache来实现访问授权。
[root@centos-6.5-x64 ~]#htpasswd -c /usr/local/nagios/etc/htpasswd root #添加授权用户root,名字可自己定义。
New password:
Re-type new password:
Adding password for user root
[root@centos-6.5-x64 ~]#service nagios start
[root@centos-6.5-x64 ~]#service httpd start
现在可以访问nagios了。
http://192.168.1.53/nagios/



安装完成。

PS:
安装完成后访问出现的几个错误。

报错1:
错误: 无法正确地读出配置文件中的对象数据!
[root@localhost ~]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg #检查配置文件
我执行后提示我Line 1043 (UNKNOWN VARIABLE) 1043行有错误。
#service_check_timeout_state=c  #根据检查配置文件命令提示此行错误,屏蔽。

错误2:
The requested URL /nagios/cgi-bin/statusmap.cgi was not found on this server.
到/usr/local/nagios/sbin确认确实没有此文件。
这个错误是最开始安装时没有安装gd和gd-devel包,导致没有statusmap.cgi程序。不过上面我们已经安装了gd和gd-devel所以不会出现,留作提示大家注意下。
[root@localhost sbin]# yum install gd gd-devel 重新编译nagios

./configure --prefix=/usr/local/nagios --with-gd-lib=/usr/lib --with-gd-inc=/usr/include

编译nagios时通过此参数得到statusmap.cgi文件,否则登陆nagios后,点击拓扑图会提示404错误。