nginx环境下配置nagios-关于perl-fcgi.pl

配置文件如下:

请注意,网上提供的官方文档在运行时可能会出现问题,此文中保证无问题。

 

  1 #!/usr/bin/perl
  2 #
  3 #       author          Daniel Dominik Rudnicki
  4 #       thanks to:      Piotr Romanczuk
  5 #       email           [email protected]
  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 $> UID "  if $verbose;
 29         print  "  Perl $] "  if $verbose;
 30 
 31 #        if ( $> ==  " 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 $> 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         exit unless $@ =~ /^fakeexit/;
157 } ;
158 
159 # fork part
160 my $pid = fork();
161 
162  if( $pid ==  0 ) {
163         &main;
164         exit  0;
165 }
166 
167 print  "  Forking worker process with PID $pid\n "  if $verbose;
168 addlog($logfile,  " Forking worker process with PID $pid ");
169 print  "  Update PID file $filepid\n "  if $verbose;
170 addlog($logfile,  " Update PID file $filepid ");
171 $pid > io($filepid);
172 print  "  Worker process running.\n "  if $verbose;
173 addlog ($logfile,  " Parent process $$ is exiting ");
174 exit  0;
175 
176 sub main {
177         $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );
178          if ($request) { request_loop()};
179                 FCGI::CloseSocket( $socket );
180 }
181 
182 sub request_loop {
183          while( $request->Accept() >=  0 ) {
184                 # processing any STDIN input  from WebServer ( for CGI-POST actions)
185                 $stdin_passthrough =  '';
186                 $req_len =  0 + $req_params{ ' CONTENT_LENGTH '};
187                  if (($req_params{ ' REQUEST_METHOD '} eq  ' POST ') && ($req_len !=  0) ){
188                          while ($req_len) {
189                                 $stdin_passthrough .= getc(STDIN);
190                                 $req_len--;
191                         }
192                 }
193 
194                 # running the cgi app
195                  if ( (-x $req_params{SCRIPT_FILENAME}) &&
196                         (-s $req_params{SCRIPT_FILENAME}) &&
197                         (-r $req_params{SCRIPT_FILENAME})
198                 ){
199                          foreach $key ( keys %req_params){
200                                 $ENV{$key} = $req_params{$key};
201                         }
202                          if ( $verbose ) {
203                                 addlog($logfile,  " running $req_params{SCRIPT_FILENAME} ");
204                         }
205                         # http: // perldoc.perl.org/perlipc.html#Safe-Pipe-Opens
206                          #
207                         #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 ! ");
208                         open $cgi_app,  ' -| '" echo '$stdin_passthrough' | '$req_params{SCRIPT_FILENAME}' " 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 ! ");
209 
210                          if ($cgi_app) {
211                                 print <$cgi_app>;
212                                 close $cgi_app;
213                         }
214                 }  else {
215                         print( " Content-type: text/plain\r\n\r\n ");
216                         print  " Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n ";
217                         addlog($logfile,  " Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process. ");
218                 }
219         }
220 }

221                                                                                                                                                       

你可能感兴趣的:(nagios)