nagios+nginx从环境搭建到配置

来源:互联网 发布:mv播放器软件 编辑:程序博客网 时间:2024/05/01 22:51
 

nagios+nginx从环境搭建到配置

分类: 学习体会 1010人阅读 评论(0) 收藏 举报

目录(?)[+]

nagios+nginx从环境搭建到配置

    nagios是一个开源免费的系统监控工具,官网地址 http://www.nagios.org/
    截止2011-07-27    nagios的最新版本是3.x,基于c语言编写,并提供了一个基于php和cgi的web管理界面
    

环境搭建

    nagios需要一个web容器+php的运行环境,由于现在的公司统一使用nginx作为web容器,在这里我选择了nginx+php
    nginx官网地址为    http://nginx.org/
    php官网地址为    http://www.php.net/
    
    如果对于nagios的web界面,需要根据用户配置相应的访问权限的话,那还得安装一个apache,没别的用途,就是用htpassword生成账户信息。
    apache官网地址    http://httpd.apache.org/
    
    我所准备的jar包如下,其中spawn-fcgi是用于nginx重定向到php用的
        lighttpd-1.4.28.tar.gz
        nginx-1.0.5.tar.gz
        php-5.3.6.tar.gz
        spawn-fcgi-1.6.2.tar.gz
        
    安装nginx    

[ruby] view plaincopy
  1. tar nginx-1.0.5.tar.gz  
  2. cd nginx-1.0.5/  
  3. ./configure    --prefix=/usr/local/nginx  
  4. make && make install  

   
    注意--prefix是在指定软件的安装路径,可以根据个人情况自行修改
    安装php之前最好参考张宴的这篇博客 http://blog.s135.com/post/297/ 安装对应的图形和xml等lib,当然稍后安装也行    

   

[ruby] view plaincopy
  1. tar zxvf php-5.3.6.tar.gz  
  2. cd php-5.3.6/  
  3. ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc l --with-zlib  --disable-debug --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-force-cgi-redirect  
  4. make && make install  
  5. cp php.ini-dist /usr/local/php/etc/php.ini  
  6. cd ../  


    注意,一定要带上--enable-fastcgi --enable-force-cgi-redirect,如果执行 ./configure时 提示缺少某个包,比如zlib,gd等等,安装上即可
    
    解压缩并安装 spawn-fcgi,与张宴博客不同的是,在我写这篇博客时spawn-fcgi已经作为单独的包提供使用了

 

[plain] view plaincopy
  1. tar spawn-fcgi-1.6.2.tar.gz  
  2. cd spawn-fcgi-1.6.2/  
  3. ./configure    --prefix=/usr/local/spawn-fcgi  
  4. make && make install  


    然后仅仅是把spawn-fcgi这个文件copy去php的bin目录下,为什么仅仅只要一个文件呢?好吧,我也不知道。

cp spawn-fcgi /usr/local/php/binchmod +x /usr/local/php/bin/spawn-fcgi

   
    启动php cgi进程

 /usr/local/php/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 250 -u www -f /usr/local/php/bin/php-cgi

  这样一来环境就搭建的差不多了,这中间容易出问题的就是php安装的时候可能会报缺某些工具包
    

安装nagios及其插件nagios-plugin

   

[plain] view plaincopy
  1. tar nagios-3.2.3.tar.gz  
  2. cd nagios-3.2.3/  
  3. ./configure    --prefix=/usr/local/nagios --with-gd --with-libpng --with-libjpeg  
  4. make && make install  


    注意,在安装gd,libpng,libjpeg时还需要安装对应的devel包才行,即gd-devel,libpng-devel,libjpeg-devel

[plain] view plaincopy
  1. tar nagios-plugins-1.4.15.tar.gz  
  2. cd nagios-plugins-1.4.15/  
  3. ./configure    --prefix=/usr/local/nagios --with-gd --with-libpng --with-libjpeg  
  4. make && make install  


    安装fast-cgi

[plain] view plaincopy
  1. tar FCGI-ProcManager-0.19.tar.gz  
  2. cd FCGI-ProcManager-0.19/  
  3. ./configure    --prefix=/usr/local/fcgi  
  4. make && make install  

    
    在很多nginx+nagios的搭建教程中都提到一个 nginx-fcgi的脚本文件,下载地址是http://www.nginx.eu/nginx-fcgi/nginx-fcgi.txt 但当我写这篇博客时该地址已经失效了,脚本文件作为附件奉上
    
    然后启动fcgi

 ./nginx-fcgi -l /usr/local/logs/nginx-fcgi.log -pid /tmp/nginx-fcgi.pid -S /tmp/nginx-fcgi.sock

    注意, -pid用于指定nginx-fcgi的进程pid, 需要执行以下命令更改运行权限

 chmod    777 /tmp/nginx-fcgi.sock

   

配置nginx


[plain] view plaincopy
  1. cd /usr/local/nginx/conf  
  2. vi nginx.conf  


 添加如下设置

[plain] view plaincopy
  1. server {  
  2.     listen          80;  
  3.     server_name     nagios.test.com;  
  4.     root            /usr/local/nagios/share;  
  5.     index index.html index.htm index.php default.html default.htm default.php;  
  6.   
  7.     location ~ .*\.php?$ {  
  8.             fastcgi_pass    127.0.0.1:9000;  
  9.             fastcgi_index   index.php;  
  10.             include fastcgi.conf;  
  11.             fastcgi_param SCRIPT_FILENAME /usr/local/nagios/share$fastcgi_script_name;  
  12.             auth_basic      "nagios admin";  
  13.             auth_basic_user_file    /usr/local/nagios/etc/nagiosAdmin.net;  
  14.      }  
  15.     location ~ .*\.cgi$ {  
  16.             root    /usr/local/nagios/sbin;  
  17.             rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;  
  18.             fastcgi_pass unix:/tmp/nginx-fcgi.sock;  
  19.             fastcgi_index index.cgi;  
  20.             fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;  
  21.             include fastcgi.conf;  
  22.             auth_basic      "nagios admin";  
  23.             auth_basic_user_file    /usr/local/nagios/etc/nagiosAdmin.net;  
  24.   
  25.     }  
  26.     location /nagios {  
  27.             alias /usr/local/nagios/share;  
  28.             auth_basic      "nagios admin";  
  29.             auth_basic_user_file    /usr/local/nagios/etc/nagiosAdmin.net;  
  30.   
  31.     }  
  32.     location ~ .*\.pl$ {  
  33.             fastcgi_pass  unix:/tmp/nginx-fcgi.sock;  
  34.             fastcgi_index index.pl;  
  35.             fastcgi_param SCRIPT_FILENAME  /usr/local/nagios/sbin$fastcgi_script_name;  
  36.             include fastcgi.conf;  
  37.     }  
  38. }  


  其中 auth_basic和auth_basic_user_file用于指定该种URI的访问权限,对应的 /usr/local/nagios/etc/nagiosAdmin.net 需要事先用htpasswd命令生成
    后缀为.php的URI用
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        来指定给spawn-cgi处理
    后缀为.cgi的URI用
        root    /usr/local/nagios/sbin;
        rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
        fastcgi_pass unix:/tmp/nginx-fcgi.sock;
        fastcgi_index index.cgi;
        fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;
        include fastcgi.conf;
    指定给刚才启动的nginx-fcgi进程处理,注意nagios的php程序都在/usr/local/nagios/share 下,而cgi程序都在/usr/local/nagios/sbin下,别搞错路径
    
之后就是启动nagios,nginx,在你当前机器设置host后访问 http://nagios.test.com 查看web内容

nagios的配置

nagios的配置文件都在/usr/local/nagios/etc下,其中    
    nagios.cfg    是主配置文件
    cgi.cfg    用于配置权限之类
    详细配置文件在/usr/local/nagios/etc/object之内,如何配置详见 http://nagios-cn.sourceforge.net/nagios-cn/cgiconfig.html
    配置文件修改完毕后,执行命令 /usr/local/nagios/bin/nagios -pv /usr/local/nagios/etc/nagios.cfg 更新缓存,详见http://nagios-cn.sourceforge.net/nagios-cn

  下面是nginx-fcgi的源码

[plain] view plaincopy
  1. #!/usr/bin/perl  
  2. #  
  3. #   author      Daniel Dominik Rudnicki  
  4. #   thanks to:  Piotr Romanczuk  
  5. #   email       daniel@sardzent.org  
  6. #   version     0.4.3  
  7. #   webpage     http://www.nginx.eu/  
  8. #  
  9. #   BASED @ http://wiki.codemongers.com/NginxSimpleCGI  
  10. #  
  11. #  
  12. # use strict;  
  13. use FCGI;  
  14. use Getopt::Long;  
  15. use IO::All;  
  16. use Socket;  
  17.   
  18. sub init {  
  19.     GetOptions( "h" => \$help,  
  20.             "verbose!"=>\$verbose,  
  21.             "pid=s" => \$filepid,  
  22.             "l=s" => \$logfile,  
  23.             "S:s"   => \$unixsocket,  
  24.             "P:i"   => \$unixport) or usage();  
  25.         usage() if $help;  
  26.   
  27.     print " Starting Nginx-fcgi\n" if $verbose;  
  28.     print " Running with {1}gt; UID" if $verbose;  
  29.     print " Perl $]" if $verbose;  
  30.   
  31. #   if ( {1}gt; == "0" ) {  
  32. #       print "\n\tERROR\tRunning as a root!\n";  
  33. #       print "\tSuggested not to do so !!!\n\n";  
  34. #       exit 1;  
  35. #   }  
  36.   
  37.         if ( ! $logfile ) {  
  38.         print "\n\tERROR\t log file must declared\n"  
  39.             . "\tuse $0 with option -l filename\n\n";  
  40.         exit 1;  
  41.     }  
  42.     print " Using log file $logfile\n" if $verbose;  
  43.     "\n\n" >> io($logfile);  
  44.     addlog($logfile, "Starting Nginx-cfgi");  
  45.     addlog($logfile, "Running with {1}gt; UID");  
  46.     addlog($logfile, "Perl $]");  
  47.     addlog($logfile, "Testing socket options");  
  48.   
  49.     if ( ($unixsocket && $unixport) || (!($unixsocket) && !($unixport)) ) {  
  50.         print "\n\tERROR\tOnly one option can be used!\n";  
  51.         print "\tSuggested (beacuse of speed) is usage UNIX socket -S \n\n";  
  52.         exit 1;  
  53.     }  
  54.   
  55.     if ($unixsocket) {  
  56.         print " Daemon listening at UNIX socket $unixsocket\n" if $versbose;  
  57.         addlog($logfile, "Deamon listening at UNIX socket $unixsocket");  
  58.     } else {  
  59.         print " Daemon listening at TCP/IP socket *:$unixport\n" if $verbose;  
  60.         #  
  61.         addlog($logfile, "Daemon listening at TCP/IP socket *:$unixport");  
  62.     }  
  63.   
  64.     if ( -e $filepid ) {  
  65.         print "\n\tERROR\t PID file $filepid already exists\n\n";  
  66.         addlog($logfile, "Can not use PID file $filepid, already exists.");  
  67.         exit 1;  
  68.     }  
  69.   
  70.     if ( $unixsocket ) {  
  71.         print " Creating UNIX socket\n" if $verbose;  
  72.         $socket = FCGI::OpenSocket( $unixsocket, 10 );  
  73.         if ( !$socket) {  
  74.             print " Couldn't create socket\n";  
  75.             addlog($logfile, "Couldn't create socket");  
  76.             exit 1;  
  77.         }  
  78.         print " Using UNIX socket $unixsocket\n" if $verbose;  
  79.     } else {  
  80.         print " Creating TCP/IP socket\n" if $verbose;  
  81.         $portnumber = ":".$unixport;  
  82.         $socket = FCGI::OpenSocket( $unixport, 10 );  
  83.         if ( !$socket ) {  
  84.             print " Couldn't create socket\n";  
  85.             addlog($logfile, "Couldn't create socket");  
  86.             exit 1;  
  87.         }  
  88.         print " Using port $unixport\n" if $verbose;  
  89.     }  
  90.     addlog($logfile, "Socket created");  
  91.   
  92.     if ( ! $filepid ) {  
  93.         print "\n\tERROR\t PID file must declared\n"  
  94.             . "\tuse $0 with option -pid filename\n\n";  
  95.         exit 1;  
  96.     }  
  97.     print " Using PID file $filepid\n" if $verbose;  
  98.     addlog($logfile, "Using PID file $filepid");  
  99.   
  100.     my $pidnumber = $;  
  101.     $pidnumber > io($filepid);  
  102.     print " PID number $\n" if $verbose;  
  103.     addlog($logfile, "PID number $pidnumber");  
  104.       
  105. }  
  106.   
  107. sub addzero {  
  108.     my ($date) = shift;  
  109.     if ($date < 10) {  
  110.         return "0$date";  
  111.     }  
  112.        return $date;  
  113. }  
  114.   
  115. sub logformat {  
  116.     my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$iddst) = localtime(time);  
  117.     my $datestring;  
  118.     $year += 1900;  
  119.     $mon++;  
  120.     $mon  = addzero($mon);  
  121.     $mday = addzero($mday);  
  122.     $min  = addzero($min);  
  123.     $datestring = "$year-$mon-$mday $hour:$min";  
  124.     return($datestring);  
  125. }  
  126.   
  127. sub addlog {  
  128.     my ($log_file, $log_message) = @_;  
  129.     my $curr_time = logformat();  
  130.     my $write_message = "[$curr_time]   $log_message";  
  131.     $write_message >> io($log_file);  
  132.     "\n" >> io($log_file);  
  133. }  
  134.   
  135. sub printerror {  
  136.     my $message = @_;  
  137.     print "\n   Nginx FastCGI\tERROR\n"  
  138.         . "\t $message\n\n";  
  139.     exit 1;  
  140. }  
  141.   
  142. sub usage {  
  143.     print "\n   Nginx FastCGI \n"  
  144.         . "\n\tusage: $0 [-h] -S string -P int\n"  
  145.         . "\n\t-h\t\t: this (help) message"  
  146.         . "\n\t-S path\t\t: path for UNIX socket"  
  147.         . "\n\t-P port\t\t: port number"  
  148.         . "\n\t-p file\t\t: path for pid file"  
  149.         . "\n\t-l file\t\t: path for logfile"  
  150.         . "\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";  
  151.     exit 1;  
  152. }  
  153.   
  154.   
  155. init;  
  156. #  
  157. END() { } BEGIN() { }  
  158. *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; eval q{exit};   
  159. if ($@) {   
  160.     exit unless $@ =~ /^fakeexit/;   
  161. } ;  
  162.   
  163. # fork part  
  164. my $pid = fork();  
  165.   
  166. if( $pid == 0 ) {  
  167.     &main;  
  168.     exit 0;  
  169. }  
  170.   
  171. print " Forking worker process with PID $pid\n" if $verbose;  
  172. addlog($logfile, "Forking worker process with PID $pid");  
  173. print " Update PID file $filepid\n" if $verbose;  
  174. addlog($logfile, "Update PID file $filepid");  
  175. $pid > io($filepid);  
  176. print " Worker process running.\n" if $verbose;  
  177. addlog ($logfile, "Parent process $ is exiting");  
  178. exit 0;  
  179.   
  180. sub main {  
  181.     $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );  
  182.     if ($request) { request_loop()};  
  183.         FCGI::CloseSocket( $socket );  
  184. }  
  185.   
  186. sub request_loop {  
  187.     while( $request->Accept() >= 0 ) {  
  188.         # processing any STDIN input from WebServer (for CGI-POST actions)  
  189.         $stdin_passthrough = '';  
  190.         $req_len = 0 + $req_params{'CONTENT_LENGTH'};  
  191.         if (($req_params{'REQUEST_METHOD'} eq 'POST') && ($req_len != 0) ){  
  192.             while ($req_len) {  
  193.                 $stdin_passthrough .= getc(STDIN);  
  194.                 $req_len--;   
  195.             }  
  196.         }  
  197.   
  198.         # running the cgi app  
  199.         if ( (-x $req_params{SCRIPT_FILENAME}) &&   
  200.             (-r $req_params{SCRIPT_FILENAME})  
  201.         ){  
  202.             foreach $key ( keys %req_params){  
  203.                 $ENV{$key} = $req_params{$key};  
  204.             }  
  205.             if ( $verbose ) {  
  206.                 addlog($logfile, "running $req_params{SCRIPT_FILENAME}");  
  207.             } else {  
  208.                 addlog($logfile, "running $req_params{SCRIPT_FILENAME} fail");  
  209.             }  
  210.             # http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens  
  211.             #  
  212.             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 !");  
  213.               
  214.             if ($cgi_app) {   
  215.                 addlog($logfile, "$cgi_app is ok.\n");  
  216.                 print <$cgi_app>;   
  217.                 close $cgi_app;   
  218.             } else {  
  219.                 addlog($logfile, "$cgi_app is not ok!\n");  
  220.             }  
  221.         } else {  
  222.             print("Content-type: text/plain\r\n\r\n");  
  223.             print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process. File Again!!\n";  
  224.             addlog($logfile, "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.");  
  225.         }  
  226.     }  
  227. }  

原创粉丝点击