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, "-|");
- 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;
- }
- if ($pid > 0) {
- close(CHILD_RD);
- print PARENT_WR $stdin_passthrough;
- close(PARENT_WR);
- while(my $s = <KID_TO_READ>) { 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, "<&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";
- }
- }
- }
3、给文件加执行权限。
- chmod +x /usr/local/bin/fastcgi.pl
执行之前先确认/var/run/nginx/这个文件夹存在,没有mkdir /var/run/nginx/
否则执行会报错:bind/listen: 没有那个文件或目录
执行之后查看/var/run/nginx目录下是不是多了一个perl_cgi-dispatch.sock文件
4、到nginx配置文件里添加,下面是我的配置
- server
- {
- listen 80;
- server_name nagios.zdworks.com;
- root /usr/local/nagios/share;
- index index.php;
- #设置编码方式,我没有加上这个的话界面部分乱码。很奇怪为什么不是全部乱码
- charset utf-8;
- location ~ .*\.(php|php5)?$
- {
- #root /usr/local/nagios/share;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- fastcgi_param HTTP_ACCEPT_LANGUAGE zh-cn;
- #fastcgi_params文件以自己的路径为准,我使用了绝对路径
- include /etc/nginx/fastcgi_params;
- auth_basic "Nagios Login pain";
- #认证的文件名和路径按自己的修改
- auth_basic_user_file /usr/local/nagios/etc/htpasswd.users;
- }
- location ~ .*\.cgi$ {
- root /usr/local/nagios/sbin;
- rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
#这个就是前面生成的sock文件,这个设置错误cgi文件就没有办法显示 - fastcgi_pass unix:/var/run/nginx/perl_cgi-dispatch.sock;
- fastcgi_index index.cgi;
- fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin/$fastcgi_script_name;
- include /etc/nginx/fastcgi_params;
- fastcgi_param AUTH_USER $remote_user;
- fastcgi_param REMOTE_USER $remote_user;
- auth_basic "Nagios Login pain";
- auth_basic_user_file /usr/local/nagios/etc/htpasswd.users;
- }
- location /nagios {
- alias /usr/local/nagios/share/;
- }
- }
没有装cgi前我nginx日志错误
- [error] 13964#0: *27 FastCGI sent in stderr: "PHP Warning: Unexpected character in input: ' in /usr/local/nagios/sbin/status.cgi on line 194
- PHP Parse error: syntax error, unexpected '<' in /usr/local/nagios/sbin/status.cgi on line 194" while reading response header from upstream, client: 192.168.1.180, server: nagios.com, request: "GET /nagios/cgi-bin/status.cgi?hostgroup=all&style=summary HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "nagios.com", referrer: "http://nagios.com/side.php"
这个是cgi没有装好才会报的错。
相关推荐
wenwst 2020-02-13
CoolGe 2014-03-21
soilzhang 2015-01-21
shuyun00 2015-05-22
tpzmz0 2019-10-27
Billow 2011-06-04
Linuxest 2011-05-23
libowenhit 2011-05-22
carrieyang 2011-05-18
HelloC先生 2010-10-02
功夫熊猫 2009-11-01
Will0 2009-07-07
李迟 2009-02-20
loveyy 2019-07-18
nes00 2015-01-21
thone00 2014-01-14
silenter00 2011-06-27
devilbuqi 2014-11-24