cheng029 发表于 2013-12-30 17:59:38

Centos6.4 Nginx环境下安装配置nagios

1.环境:
centos 6.4 X64
nginx 1.4.8
php 5.3.17
php和nginx提前安装这里不再详细介绍,如果比较懒可以下载lnmp一键安装包来安装。
所需软件安装包:
nagios 4.0.2 金山快盘附件:nagios-4.0.2.tar.gz(1.62MB)
nagios-plugins1.5 金山快盘附件:nagios-plugins-1.5.tar.gz(2.32MB)

FCGI-0.74.tar.gz 金山快盘附件:FCGI-0.74.tar.gz(95.31KB)
FCGI-ProcManager-0.24.tar.gz 金山快盘附件:FCGI-ProcManager-0.24.tar.gz(21.06KB)
IO-All-0.50.tar.gz 金山快盘附件:IO-All-0.50.tar.gz(82.08KB)
所有软件包都已上传到附件可下载。
2.建立用户:
# useradd nagios -s /sbin/nologin
3.安装nagios
# tar zxvf nagios-4.0.2.tar.gz
# cd nagios-4.0.2
# ./configure --prefix=/usr/local/nagios

make all
make install
make install-init
make install-config
make install-commandmode

注:
(1)make install 安装主要的程序、CGI及HTML文件
(2)make install-commandmode 给外部命令访问nagios配置文件权限
(3)make install-config 把配置文件的例子复制到nagios的安装目录

4.安装nagios插件:
# tar zxvf nagios-plugins-1.5.tar.gz
# cd nagios-plugins-1.5
# ./configure --prefix=/usr/local/nagios
# make && make install
5.配置nagios开机启动
# chkconfig nagios on
# chkconfig --list nagios
nagios               0:off      1:off      2:on      3:on      4:on      5:on      6:off

6.安装Perl fcgi模块,让Nginx支持CGI
tar -zxf FCGI-0.74.tar.gz
cd FCGI-0.74
perl Makefile.PL
make && make install

tar -zxf FCGI-ProcManager-0.24.tar.gz
cd FCGI-ProcManager-0.24
perl Makefile.PL
make && make install

tar zxf IO-All-0.50.tar.gz
cd IO-All-0.50
perl Makefile.PL
make && make install

7.建立nginx-fcgi脚本:
vim /usr/local/nginx/sbin/nginx-fcgi

#!/usr/bin/perl
#
#   author      Daniel Dominik Rudnicki
#   thanks to:Piotr Romanczuk
#   email       daniel@sardzent.org
#   version   0.4.3
#   webpage   http://www.nginx.eu/
#
#   BASED @ http://wiki.codemongers.com/NginxSimpleCGI
#
#
# use strict;
use FCGI;
use Getopt::Long;
use IO::All;
use Socket;

sub init {
    GetOptions( "h" => \$help,
            "verbose!"=>\$verbose,
            "pid=s" => \$filepid,
            "l=s" => \$logfile,
            "S:s"   => \$unixsocket,
            "P:i"   => \$unixport) or usage();
      usage() if $help;

    print " Starting Nginx-fcgi\n" if $verbose;
    print " Running with $> UID" if $verbose;
    print " Perl $]" if $verbose;

#   if ( $> == "0" ) {
#       print "\n\tERROR\tRunning as a root!\n";
#       print "\tSuggested not to do so !!!\n\n";
#       exit 1;
#   }

      if ( ! $logfile ) {
      print "\n\tERROR\t log file must declared\n"
            . "\tuse $0 with option -l filename\n\n";
      exit 1;
    }
    print " Using log file $logfile\n" if $verbose;
    "\n\n" >> io($logfile);
    addlog($logfile, "Starting Nginx-cfgi");
    addlog($logfile, "Running with $> UID");
    addlog($logfile, "Perl $]");
    addlog($logfile, "Testing socket options");

    if ( ($unixsocket && $unixport) || (!($unixsocket) && !($unixport)) ) {
      print "\n\tERROR\tOnly one option can be used!\n";
      print "\tSuggested (beacuse of speed) is usage UNIX socket -S \n\n";
      exit 1;
    }

    if ($unixsocket) {
      print " Daemon listening at UNIX socket $unixsocket\n" if $versbose;
      addlog($logfile, "Deamon listening at UNIX socket $unixsocket");
    } else {
      print " Daemon listening at TCP/IP socket *:$unixport\n" if $verbose;
      #
      addlog($logfile, "Daemon listening at TCP/IP socket *:$unixport");
    }

    if ( -e $filepid ) {
      print "\n\tERROR\t PID file $filepid already exists\n\n";
      addlog($logfile, "Can not use PID file $filepid, already exists.");
      exit 1;
    }

    if ( $unixsocket ) {
      print " Creating UNIX socket\n" if $verbose;
      $socket = FCGI::OpenSocket( $unixsocket, 10 );
      if ( !$socket) {
            print " Couldn't create socket\n";
            addlog($logfile, "Couldn't create socket");
            exit 1;
      }
      print " Using UNIX socket $unixsocket\n" if $verbose;
    } else {
      print " Creating TCP/IP socket\n" if $verbose;
      $portnumber = ":".$unixport;
      $socket = FCGI::OpenSocket( $unixport, 10 );
      if ( !$socket ) {
            print " Couldn't create socket\n";
            addlog($logfile, "Couldn't create socket");
            exit 1;
      }
      print " Using port $unixport\n" if $verbose;
    }
    addlog($logfile, "Socket created");

    if ( ! $filepid ) {
      print "\n\tERROR\t PID file must declared\n"
            . "\tuse $0 with option -pid filename\n\n";
      exit 1;
    }
    print " Using PID file $filepid\n" if $verbose;
    addlog($logfile, "Using PID file $filepid");

    my $pidnumber = $$;
    $pidnumber > io($filepid);
    print " PID number $$\n" if $verbose;
    addlog($logfile, "PID number $pidnumber");
      
}

sub addzero {
    my ($date) = shift;
    if ($date < 10) {
      return "0$date";
    }
       return $date;
}

sub logformat {
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$iddst) = localtime(time);
    my $datestring;
    $year += 1900;
    $mon++;
    $mon= addzero($mon);
    $mday = addzero($mday);
    $min= addzero($min);
    $datestring = "$year-$mon-$mday $hour:$min";
    return($datestring);
}

sub addlog {
    my ($log_file, $log_message) = @_;
    my $curr_time = logformat();
    my $write_message = "[$curr_time]   $log_message";
    $write_message >> io($log_file);
    "\n" >> io($log_file);
}

sub printerror {
    my $message = @_;
    print "\n   Nginx FastCGI\tERROR\n"
      . "\t $message\n\n";
    exit 1;
}

sub usage {
    print "\n   Nginx FastCGI \n"
      . "\n\tusage: $0 [-h] -S string -P int\n"
      . "\n\t-h\t\t: this (help) message"
      . "\n\t-S path\t\t: path for UNIX socket"
      . "\n\t-P port\t\t: port number"
      . "\n\t-p file\t\t: path for pid file"
      . "\n\t-l file\t\t: path for logfile"
      . "\n\n\texample: $0 -S /var/run/nginx-perl_cgi.sock -l /var/log/nginx/nginx-cfgi.log -pid /var/run/nginx-fcgi.pid\n\n";
    exit 1;
}


init;
#
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; eval q{exit};   
if ($@) {   
    exit unless $@ =~ /^fakeexit/;   
} ;

# fork part
my $pid = fork();

if( $pid == 0 ) {
    &main;
    exit 0;
}

print " Forking worker process with PID $pid\n" if $verbose;
addlog($logfile, "Forking worker process with PID $pid");
print " Update PID file $filepid\n" if $verbose;
addlog($logfile, "Update PID file $filepid");
$pid > io($filepid);
print " Worker process running.\n" if $verbose;
addlog ($logfile, "Parent process $$ is exiting");
exit 0;

sub main {
    $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) ){
            while ($req_len) {
                $stdin_passthrough .= getc(STDIN);
                $req_len--;   
            }
      }

      # running the cgi app
      if ( (-x $req_params{SCRIPT_FILENAME}) &&   
            (-s $req_params{SCRIPT_FILENAME}) &&   
            (-r $req_params{SCRIPT_FILENAME})
      ){
            foreach $key ( keys %req_params){
                $ENV{$key} = $req_params{$key};
            }
            if ( $verbose ) {
                addlog($logfile, "running $req_params{SCRIPT_FILENAME}");
            }
            # http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens
            #
            open $cgi_app, '-|', $req_params{SCRIPT_FILENAME}, $stdin_passthrough or print("Content-type: text/plain\r\n\r\n"); print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n"; # addlog($logfile, "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !");
            
            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_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";
            addlog($logfile, "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.");
      }
    }
}

8.授予脚本可执行权限:
# cd /usr/local/nginx/sbin/
# ls
nginxnginx-fcginginx.old
# chmod a+x nginx-fcgi

并启动脚本:
/usr/local/nginx/sbin/nginx-fcgi -l /usr/local/nginx/logs/nginx-fcgi.log -pid /usr/local/nginx/logs/nginx-fcgi.pid -S /usr/local/nginx/logs/nginx-fcgi.sock
查看是否启动:
# ps -aux |grep fcgi
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root      67100.00.2 1364044540 pts/2    S    17:42   0:00 /usr/bin/perl /usr/local/nginx/sbin/nginx-fcgi -l /usr/local/nginx/logs/nginx-fcgi.log -pid /usr/local/nginx/logs/nginx-fcgi.pid -S /usr/local/nginx/logs/nginx-fcgi.sock
root      67120.00.0 103172   848 pts/2    S+   17:42   0:00 grep fcgi

已经正常启动。
授予nginx-fcgi.sock 777权限。
# chmod -R 777 /usr/local/nginx/logs/nginx-fcgi.sock
9.设置登录密码保证安全:
# htpasswd -c /usr/local/nginx/conf/htpasswd nagios
New password:
Re-type new password:
Adding password for user nagios

10.在nginx里面设置一个虚拟主机:

server
      {
                listen       80;
                server_name nagios.a.com;
                index index.html index.htm index.php default.html default.htm default.php;
                root /usr/local/nagios/share;                auth_basic "nagios";                  auth_basic_user_file /usr/local/nginx/conf/htpasswd;
location ~ \.cgi$ {
root /usr/local/nagios/sbin;
rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
fastcgi_index index.cgi;
fastcgi_pass unix:/usr/local/nginx/logs/nginx-fcgi.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 REMOTE_USER $remote_user;
#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;
}
               
                location ~ .*\.(php|php5)?$
                        {
                              try_files $uri =404;
                              fastcgi_passunix:/tmp/php-cgi.sock;
                              fastcgi_index index.php;
                              include fcgi.conf;
                        }

                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
                        {
                              expires      30d;
                        }

                location ~ .*\.(js|css)?$
                        {
                              expires      12h;
                        }

                access_log/home/wwwlogs/nagios.a.com.lognagios.a.com;
      }

重新加载配置文件:
# /usr/local/nginx/sbin/nginx -s reload
11.如果图片加载不正常加个链接就好了:
# mkdir -p /usr/local/nagios/share/nagios
# ln -s /usr/local/nagios/share/images /usr/local/nagios/share/nagios/images
# ln -s /usr/local/nagios/share/stylesheets /usr/local/nagios/share/nagios/stylesheets

12.配置可加载GD动态库:
vim /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/gd/lib   #加入GD动态库路径
然后手动运行一下:
ldconfig
解决了map和trends错误的问题!




鬼泣 发表于 2013-12-30 21:25:11

也许放弃才能靠近你不再见你你才会把我想起

midea2 发表于 2013-12-30 21:56:42

青春仿佛因我爱你而开始,却令我看破爱这个字。

ycycoco 发表于 2013-12-30 22:06:45

最初的那些誓言,却抵不过时间的摧残。
页: [1]
查看完整版本: Centos6.4 Nginx环境下安装配置nagios