515439429 发表于 2018-11-25 11:07:17

nagios从apache平台转nginx配置

  刚装好nagios,和cacti整合起来了。cacti使用的是nginx,所以现在想把nagios从apache平台上转到nginx上。
  nginx需要perl cgi支持才能保证nagios的运行,所以要安装perl cgi环境
  1、装PERL的FCGI模块
  


[*]#perl -MCPAN -e 'install FCGI'
[*]#perl -MCPAN -e 'install FCGI::ProcManager'
  

  2、编写perl启动脚本,运行这个脚本生成的sock文件就是我们需要的。
  


[*]#vi /usr/local/bin/fastcgi.pl

  


[*]#!/usr/bin/perl
[*]
[*]use FCGI;
[*]#perl -MCPAN -e 'install FCGI'
[*]use Socket;
[*]use POSIX qw(setsid);
[*]#use Fcntl;
[*]
[*]require 'syscall.ph';
[*]
[*]&daemonize;
[*]
[*]#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 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 {
[*]      #$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets
[*]      $socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-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 );
[*]      if ($request) { request_loop()};
[*]            FCGI::CloseSocket( $socket );
[*]}
[*]
[*]sub request_loop {
[*]      while( $request->Accept() >= 0 ) {
[*]
[*]         #processing any STDIN input from WebServer (for CGI-POST actions)
[*]         $stdin_passthrough ='';
[*]         $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);
[*]      my $pid = open(KID_TO_READ, &quot;-|&quot;);
[*]      unless(defined($pid)) {
[*]            print(&quot;Content-type: text/plain\r\n\r\n&quot;);
[*]                        print &quot;Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n&quot;;
[*]            next;
[*]      }
[*]      if ($pid > 0) {
[*]            close(CHILD_RD);
[*]            print PARENT_WR $stdin_passthrough;
[*]            close(PARENT_WR);
[*]
[*]            while(my $s = ) { print $s; }
[*]            close KID_TO_READ;
[*]            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(STDIN);
[*]            #fcntl(CHILD_RD, F_DUPFD, 0);
[*]            syscall(&SYS_dup2, fileno(CHILD_RD), 0);
[*]            #open(STDIN, &quot;
页: [1]
查看完整版本: nagios从apache平台转nginx配置