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()."
"; };
- 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
\r
");
- print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !
";
- 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
\r
");
- print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.
";
- }
-
- }
- }
3. 파일 에 실행 권한 을 부여 합 니 다.
- chmod +x /usr/local/bin/fastcgi.pl
실행 하기 전에 / var / run / nginx / 이 폴 더 가 존재 하 는 지 확인 하 십시오. mkdir 가 없습니다. /var / run / nginx / 그렇지 않 으 면 실행 오류 가 발생 합 니 다: bid / 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 가 잘 담 지 않 아서 보고 한 잘못 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.