Linux安装Nagios监控系统, perl-fcgi, nginx
作者:Joshua
日期:2009年1月17日凌晨
非请勿转
安装nagios
与别的软件安装稍有不同,nagios的安装要好几步才能完成。
第一步,执行make install安装主要的程序、CGI及HTML文件;
第二步,执行 make install-commandmode 给外部命令访问nagios配置文件的权限;
第三步,执行 make install-config 把配置文件的例子复制到nagios的安装目录。
按照安装向导的提示,其实这里还有一个 make install-init的步骤,它的作用是把nagios做成一个运行脚本,使nagios随系统开机启动,这是一个很方便的措施。
cd /usr/local/ wget http://nchc.dl.sourceforge.net/sourceforge/nagios/nagios-3.0.6.tar.gz tar xzf nagios-3.0.6.tar.gz cd nagios-3.0.6 /usr/sbin/useradd nagios passwd nagios /usr/sbin/groupadd nagcmd /usr/sbin/usermod -G nagcmd nagios ./configure --with-command-group=nagcmd make all make install make install-init make install-config make install-commandmode vi /usr/local/nagios/etc/objects/contacts.cfg //修改管理员邮件地址
验证Nagios安装
验证程序是否被正确安装。切换目录到安装路径(这里是/usr/local/nagios),看是否存在 etc、bin、 sbin、 share、 var这五个目录,如果存在则可以表明程序被正确的安装到系统了。五个目录功能的简要说明:
bin Nagios执行程序所在目录,这个目录只有一个文件nagios
etc Nagios配置文件位置,初始安装完后,只有几个*.cfg-sample文件
sbin Nagios Cgi文件所在目录,也就是执行外部命令所需文件所在的目录
Share Nagios网页文件所在的目录
Var Nagios日志文件、spid 等文件所在的目录
安装nagios的插件
没有插件,nagios将什么作用也没有,插件也是nagios扩展功能的强大武器,除了下载常用的插件外,我们还可以根据实际要求编写自己的插件。 Nagios的插件nagios-plugins-1.4.5在www.nagios.org上可以找到,接着我们用wget下载它。注意:插件与 nagios之间的版本关联不大,不一定非得用nagios-plugins-1.4.5这个版本。下载完成后,安装它是很简单的:先执行配置 ./configure –prefix=/usr/local/nagios ,接着编译安装 make ;make install即可。这里需要说明一下的是在配置过程指定的安装路径是/usr/local/nagios,而不是/usr/local/nagios- plus,安装完成后,将在目录/usr/local/nagios生成目录libexec(里面有很多文件),这正是nagios所需要的。
wget http://jaist.dl.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.13.tar.gz tar xf nagios-plugins-1.4.13.tar.gz cd nagios-plugins-1.4.13 ./configure --with-nagios-user=nagios --with-nagios-group=nagcmd make make install
添加Nagios随系统启动
/sbin/chkconfig --add nagios /sbin/chkconfig nagios on /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg /sbin/service nagios start
安装perl fcgi模块
wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.67.tar.gz tar -zxvf FCGI-0.67.tar.gz cd FCGI-0.67 perl Makefile.PL make && make install
安装FCGI-ProcManager:
wget http://search.cpan.org/CPAN/authors/id/G/GB/GBJK/FCGI-ProcManager-0.18.tar.gz tar -xzxf FCGI-ProcManager-0.18.tar.gz cd FCGI-ProcManager-0.18 perl Makefile.PL make make install
cd /usr/local/nagios/bin/ vi perl-cgi.pl
#!/usr/bin/perl use FCGI; #perl -MCPAN -e 'install FCGI' use Socket; #this keeps the program alive or something after exec'ing perl scripts END() { } BEGIN() { } *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; eval q{exit}; if ($@) { exit unless $@ =~ /^fakeexit/; } ; &main; sub main { #$socket = FCGI::OpenSocket( ":3461", 10 ); #use IP sockets $socket = FCGI::OpenSocket( "/var/run/nagios.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!! $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket ); if ($request) {request_loop()}; FCGI::CloseSocket( $socket ); } sub request_loop { while( $request->Accept() >= 0 ) { #processing any STDIN input from WebServer (for CGI-GET actions) $env = $request->GetEnvironment(); $stdin_passthrough =''; $req_len = 0 + $ENV{CONTENT_LENGTH}; if ($ENV{REQUEST_METHOD} eq 'GET'){ $stdin_passthrough .= $ENV{'QUERY_STRING'}; } #running the cgi app if ( (-x $ENV{SCRIPT_FILENAME}) && #can I execute this? (-s $ENV{SCRIPT_FILENAME}) && #Is this file empty? (-r $ENV{SCRIPT_FILENAME}) #can I read this file? ){ #http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens open $cgi_app, '-|', $ENV{SCRIPT_FILENAME}, $stdin_passthrough or print("Content-type: text/plain\r\n\r\n"); print "Error: CGI app returned no output - Executing $ENV{SCRIPT_FILENAME} failed !\n"; if ($cgi_app) {print <$cgi_app>; close $cgi_app;} } else { print("Content-type: text/plain\r\n\r\n"); print "Error: No such CGI app - $req_len - $ENV{CONTENT_LENGTH} - $ENV{REQUEST_METHOD} - $ENV{SCRIPT_FILENAME} may not exist or is not executable by this process.\n"; } } }
vi start_ngind_cgi.sh#!/bin/bash ## start_nginx_cgi.sh: start nginx cgi mode ## ljzhou, 2007.08.20 PERL="/usr/bin/perl" NGINX_CGI_FILE="/usr/local/nagios/bin/perl-cgi.pl" #bg_num=`jobs -l |grep "NGINX_CGI_FILE"` #PID=`ps aux|grep "perl-cgi"|cut -c10-14|xargs kill -9` PID=`ps aux|grep 'perl-cgi'|cut -c10-14|sed -n "1P"` echo $PID sockfiles="/var/run/nagios.sock" kill -9 $PID $PERL $NGINX_CGI_FILE & sleep 3 `chown nobody.nobody $sockfiles`
创建身份认证文件
注意:这里的用户既是apache的nagios管理界面的登录认证用户也和nagios监控中的权限有关联。
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
修改nginx.conf文件,在虚拟机中加入:
location /nagios { auth_basic "Restricted"; auth_basic_user_file /usr/local/nagios/etc/htpasswd.users; } location ~ \.cgi$ { root /usr/local/nagios/sbin; rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break; fastcgi_index index.cgi; fastcgi_pass unix:/var/run/nagios.sock; fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param REQUEST_URI $request_uri; #fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param HTTP_ACCEPT_ENCODING gzip,deflate; fastcgi_param HTTP_ACCEPT_LANGUAGE zh-cn; }
之后运行/usr/local/nagios/bin/start_nginx_cgi.sh,并将它加到/etc/rc.local中。
/usr/local/nagios/bin/start_nginx_cgi.sh vi /etc/rc.local //将/usr/local/nagios/bin/start_nginx_cgi.sh写在最后一行
重启nginx:
ps -aux|grep nginx kill -HUP pid //此处的pid是ps查出的nginx主进程id
最后要把nagios的share文件放到虚拟主机根目录下,并将share改名为nagios,最佳办法是:
cd 你的虚拟主机根目录 ln -s /usr/local/nagios/share nagios
访问:http://yourhost.com/nagios
如果看到根我一样的界面,那就对了,图片点击可放大。


