64位 CentOS 5.6 中 Nagios 3.3.1 的编译安装并与Cacti

需要的包有:

FCGI-0.74.tar.gz                               462a77a0072480fea791a4d3095eb486 FCGI-ProcManager-0.24.tar.gz                   0aa184b1e5339e0ad92f4c1439406304 nagios-3.3.1.tar.gz                            c935354ce0d78a63bfabc3055fa77ad5 nagios-plugins-1.4.15.tar.gz                   56abd6ade8aa860b38c4ca4a6ac5ab0d nconf-1.3.0-0.tgz                              643b512dfa26676f652d966af37f62bd ndoutils-1.4b9.tar.gz                          659b759a5eb54b84eb44a29f26b603bc npc-2.0.4.tar.gz                               7b30302c544f10ed73cff406fda14499

前置条件:

64位 CentOS 5.6 中 Nginx + PHP + MySQL 的编译安装

64位 CentOS 5.6 中 rrdtool 的编译安装

64位 CentOS 5.6 中 Cacti 0.8.7 i 的编译安装

tar -zxvf nagios-3.3.1.tar.gz    cd nagios   ./configure --with-nagios-user=web --with-nagios-group=web --with-gd-lib=/usr/local/libgd/lib --with-gd-inc=/usr/local/libgd/include   make all   make install   make install-init   make install-config   make install-commandmode   cd ..      ln -s /usr/local/lib/libiconv.so.2.5.0 /usr/lib64/libiconv.so.2   ln -s /usr/local/nagios/share /home/web/cacti/nagios   ln -s /usr/local/nagios/sbin /usr/local/nagios/share/cgi-bin         tar -zxvf nagios-plugins-1.4.15.tar.gz    cd nagios-plugins-1.4.15   ./configure --with-nagios-user=web --with-nagios-group=web   make   make install   cd ..  

#########nagios安装完成...真的....但要小小的配置一下,才能在nginx里开起来########

#为了运行nagios里的cgi部分,需要安装perl fcgi模块,并且让nginx支持cgi的调用   #参考URL:      tar -zxvf FCGI-0.74.tar.gz    cd FCGI-0.74   perl Makefile.PL   make   make install   cd ..      tar -zxvf FCGI-ProcManager-0.24.tar.gz    cd FCGI-ProcManager-0.24   perl Makefile.PL   make   make install   cd ..  


#将以下内容保存为cgiwrap-fcgi.pl

 

#!/usr/bin/perl   use FCGI;   use Socket;   use FCGI::ProcManager;   sub shutdown { FCGI::CloseSocket($socket); exit; }   sub restart  { FCGI::CloseSocket($socket); &main; }   use sigtrap 'handler', \&shutdown, 'normal-signals';   use sigtrap 'handler', \&restart,  'HUP';   require 'syscall.ph';   use POSIX qw(setsid);       END()   { }   BEGIN() { }   {     no warnings;     *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=" . shift() . "\n"; };   };       eval q{exit};   if ($@) {     exit unless $@ =~ /^fakeexit/;   }   &main;       sub daemonize() {     chdir '/' or die "Can't chdir to /: $!";     defined( my $pid = fork ) or die "Can't fork: $!";     exit if $pid;     setsid() or die "Can't start a new session: $!";     umask 0;   }       sub main {     $proc_manager = FCGI::ProcManager->new( {n_processes => 5} );     $socket = FCGI::OpenSocket( "/tmp/cgiwrap-dispatch.sock", 10 )     ; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!     $request =     FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket,     &FCGI::FAIL_ACCEPT_ON_INTR );     $proc_manager->pm_manage();     if ($request) { request_loop() }     FCGI::CloseSocket($socket);   }       sub request_loop {     while ( $request->Accept() >= 0 ) {       $proc_manager->pm_pre_dispatch();           #processing any STDIN input from WebServer (for CGI-POST actions)       $stdin_passthrough = '';       { no warnings; $req_len = 0 + $req_params{'CONTENT_LENGTH'}; };       if ( ( $req_params{'REQUEST_METHOD'} eq 'POST' ) && ( $req_len != 0 ) ) {         my $bytes_read = 0;         while ( $bytes_read < $req_len ) {           my $data = '';           my $bytes = read( STDIN, $data, ( $req_len - $bytes_read ) );           last if ( $bytes == 0 || !defined($bytes) );           $stdin_passthrough .= $data;           $bytes_read += $bytes;         }       }           #running the cgi app       if (         ( -x $req_params{SCRIPT_FILENAME} ) &&    #can I execute this?         ( -s $req_params{SCRIPT_FILENAME} ) &&    #Is this file empty?         ( -r $req_params{SCRIPT_FILENAME} )       #can I read this file?       ) {         pipe( CHILD_RD,   PARENT_WR );         pipe( PARENT_ERR, CHILD_ERR );         my $pid = open( CHILD_O, "-|" );         unless ( defined($pid) ) {           print("Content-type: text/plain\r\n\r\n");           print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";           next;         }         $oldfh = select(PARENT_ERR);         $|     = 1;         select(CHILD_O);         $| = 1;         select($oldfh);         if ( $pid > 0 ) {           close(CHILD_RD);           close(CHILD_ERR);           print PARENT_WR $stdin_passthrough;           close(PARENT_WR);           $rin = $rout = $ein = $eout = '';           vec( $rin, fileno(CHILD_O),    1 ) = 1;           vec( $rin, fileno(PARENT_ERR), 1 ) = 1;           $ein    = $rin;           $nfound = 0;               while ( $nfound = select( $rout = $rin, undef, $ein = $eout, 10 ) ) {             die "$!" unless $nfound != -1;             $r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;             $r2 = vec( $rout, fileno(CHILD_O),    1 ) == 1;             $e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;             $e2 = vec( $eout, fileno(CHILD_O),    1 ) == 1;                 if ($r1) {               while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {                 print STDERR $errbytes;               }               if ($!) {                 $err = $!;                 die $!;                 vec( $rin, fileno(PARENT_ERR), 1 ) = 0                 unless ( $err == EINTR or $err == EAGAIN );               }             }             if ($r2) {               while ( $bytes = read( CHILD_O, $s, 4096 ) ) {                 print $s;               }               if ( !defined($bytes) ) {                 $err = $!;                 die $!;                 vec( $rin, fileno(CHILD_O), 1 ) = 0                 unless ( $err == EINTR or $err == EAGAIN );               }             }             last if ( $e1 || $e2 );           }           close CHILD_RD;           close PARENT_ERR;           waitpid( $pid, 0 );         } else {           foreach $key ( keys %req_params ) {             $ENV{$key} = $req_params{$key};           }               # cd to the script's local directory           if ( $req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/] +$/ ) {             chdir $1;            }           close(PARENT_WR);           #close(PARENT_ERR);           close(STDIN);           close(STDERR);               #fcntl(CHILD_RD, F_DUPFD, 0);           syscall( &SYS_dup2, fileno(CHILD_RD),  0 );           syscall( &SYS_dup2, fileno(CHILD_ERR), 2 );               #open(STDIN, "<&CHILD_RD");           exec( $req_params{SCRIPT_FILENAME} );           die("exec failed");         }       } else {         print("Content-type: text/plain\r\n\r\n");         print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";       }     }   }  

#放到nginx那里去

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pswfw.html