一.安裝nagios這里不做說明
1.nagios map顯示出不來,要裝GD 和GD-DEV* 然后再重新編譯nagios,要么就一開始就裝好。
二.nginx部分
1.安裝
2.配置部分,nginx不能執(zhí)行外部程序,所以我們要用fastcgi協(xié)議來調(diào)用外部程序。
Nginx并不提供支持對外部程序的直接調(diào)用或者解析(所以缺少像apache里的mod_php這樣的模塊),所有的外部程序(包括PHP)必須通過fastcgi接口來調(diào)用,在Linux下接口是socket (文件socket或者Internet socket)。所以為了調(diào)用CGI程序,我們需要一個fastcgi的wrapper,這個wrapper綁定在某個固定socket上(比如端口或者文件socket),當nginx將CGI請求發(fā)送給這個socket的時候,wrapper接納請求并fork一個新的線程,這個線程調(diào)用外部的程序或者解釋器處理腳本并讀取返回值,而wrapper再將返回的數(shù)據(jù)(網(wǎng)頁或者圖片等)通過fastcgi將數(shù)據(jù)通過那個固定的socket傳遞給nginx
目前有網(wǎng)上流行的兩種fastcgi管理器,perl-cgi和spwan-cgi,用spwan-cgi啟動php部分
例:spwan-cgi -a 127.0.0.1 -p 9000 -f /usr/local/php-cgi -C 20
這里我們也可以用-s 參數(shù)來啟用sock通信,例:unix:/var/run/nginx.sock
命令用法可以用--help來查看,然后再nginx.conf寫入
location ~ \.php$ {
root /usr/local/nagios/share/;
fastcgi_pass 127.0.0.1:9000;
# fastcgi_pass unix:/var/run/nagios.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nagios/share/$fastcgi_script_name;
include fastcgi_params;
}
把所有php結(jié)尾的訪問交給php來處理。
下面是perl-cgi的內(nèi)容,它也是根據(jù)fastcgi協(xié)議寫的
#!/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";
}
}
}
用一個腳本啟動
#!/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`
然后再加如下配置到nginx
location ~ \.cgi$ {
rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
fastcgi_pass unix:/var/run/nagios.sock;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;
fastcgi_param HTTP_ACCEPT_LANGUAGE en_US;
include fastcgi_params;
}
location ~ \.pl$ {
fastcgi_pass unix:/var/run/nagios.sock;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;
include fastcgi_params;
}
到處為止OK