Nginx 가 CGI 를 지원 하도록 설정 설치

11552 단어 nginx
쓸데없는 소리 그만 하고 시작 해...
    이치:
    Nginx 는 CGI 를 지탱 하지 않 는 것 을 묵인 하지만 FastCGI 를 지탱 하기 때문에 CGI 대신 FastCGI 를 사용 할 수 있다.
    
    준비 조건:
    1. perl 설치: 약
    2、  FCGI - ProcManage 설치
simba@simba-laptop:~/tmp$ wget http://search.cpan.org/CPAN/authors/id/G/GB/GBJK/FCGI-ProcManager-0.19.tar.gz 
        simba@simba-laptop:~/tmp$ tar -zxvf ./FCGI-ProcManager-0.19.tar.gz 
        simba@simba-laptop:~/tmp$ cd FCGI-ProcManager-0.19/
        simba@simba-laptop:~/tmp/FCGI-ProcManager-0.19$ perl Makefile.PL 
        simba@simba-laptop:~/tmp/FCGI-ProcManager-0.19$ make;sudo make install;

   3. Perl FastCGI 모듈 설치 (@ INC 에서 FCGI. pm 를 찾 을 수 없 음)
             simba@simba-laptop:~/tmp/FCGI-ProcManager-0.19$ sudo cpan FCGI
    
    Nginx cig 데 몬 만 들 기:
    1. 다음 각 은: / usr / local / bin / cgiwrap - fcgi. pl 로 실행 가능 한 권한 을 설정 합 니 다.
#!perl
use FCGI;
use Socket;
use FCGI::ProcManager;
sub shutdown { FCGI::CloseSocket($socket); exit; }
sub restart  { FCGI::CloseSocket($socket); &main; }
use sigtrap 'handler', \&shutdown, 'normal-signals';
use sigtrap 'handler', \&restart,  'HUP';
require 'syscall.ph';
use POSIX qw(setsid);
 
END()   { }
BEGIN() { }
{
  no warnings;
  *CORE::GLOBAL::exit = sub { die "fakeexit
rc=" . 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 { $proc_manager = FCGI::ProcManager->new( {n_processes => 5} ); $socket = FCGI::OpenSocket( "/tmp/cgiwrap-dispatch.sock", 10 ) ; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!! chmod 0766, "/tmp/cgiwrap-dispatch.sock"; $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket, &FCGI::FAIL_ACCEPT_ON_INTR ); $proc_manager->pm_manage(); if ($request) { request_loop() } FCGI::CloseSocket($socket); } sub request_loop { while ( $request->Accept() >= 0 ) { $proc_manager->pm_pre_dispatch(); #processing any STDIN input from WebServer (for CGI-POST actions) $stdin_passthrough = ''; { no warnings; $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 ); pipe( PARENT_ERR, CHILD_ERR ); my $pid = open( CHILD_O, "-|" ); unless ( defined($pid) ) { print("Content-type: text/plain\r
\r
"); print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !
"; next; } $oldfh = select(PARENT_ERR); $| = 1; select(CHILD_O); $| = 1; select($oldfh); if ( $pid > 0 ) { close(CHILD_RD); close(CHILD_ERR); print PARENT_WR $stdin_passthrough; close(PARENT_WR); $rin = $rout = $ein = $eout = ''; vec( $rin, fileno(CHILD_O), 1 ) = 1; vec( $rin, fileno(PARENT_ERR), 1 ) = 1; $ein = $rin; $nfound = 0; while ( $nfound = select( $rout = $rin, undef, $ein = $eout, 10 ) ) { die "$!" unless $nfound != -1; $r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1; $r2 = vec( $rout, fileno(CHILD_O), 1 ) == 1; $e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1; $e2 = vec( $eout, fileno(CHILD_O), 1 ) == 1; if ($r1) { while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) { print STDERR $errbytes; } if ($!) { $err = $!; die $!; vec( $rin, fileno(PARENT_ERR), 1 ) = 0 unless ( $err == EINTR or $err == EAGAIN ); } } if ($r2) { while ( $bytes = read( CHILD_O, $s, 4096 ) ) { print $s; } if ( !defined($bytes) ) { $err = $!; die $!; vec( $rin, fileno(CHILD_O), 1 ) = 0 unless ( $err == EINTR or $err == EAGAIN ); } } last if ( $e1 || $e2 ); } close CHILD_RD; close PARENT_ERR; 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(PARENT_ERR); close(STDIN); close(STDERR); #fcntl(CHILD_RD, F_DUPFD, 0); syscall( &SYS_dup2, fileno(CHILD_RD), 0 ); syscall( &SYS_dup2, fileno(CHILD_ERR), 2 ); #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.
"; } } }

    매일 같은 이치
오늘 은 햇빛 이 아주 좋 습 니 다. 창문 앞 에 앉 아서 창밖 의 이렇게 맑 은 날 씨 를 보 니 매우 편안 합 니 다. 비가 그 치고 날 이 맑 은 세상 은 항상 사람 에 게 밝 습 니 다. 마치 햇빛 이 '마음의 밭' 상공 을 비 추 는 것 같 습 니 다. 며칠 전에 비바람 에 짓 밟 힌 꽃 을 다시 사랑 하 는 배려 를 받 고 생명의 활력 을 재현 합 니 다!
    
    nginx cgi 데 몬 을 시작 으로 시작 합 니 다.
    root@SNDA-192-168-1-58:~/hd1/bin# echo "/usr/local/bin/cgiwrap-fcgi.pl&" > /etc/init.d/nginx-cgi 
    root@simba-laptop:/home/simba/tmp# chmod 755 /etc/init.d/nginx-cgi 
    root@SNDA-192-168-1-58:~/hd1/bin# update-rc.d nginx-cgi defaults 23
    
    Nginx 설정
set $web_root  /var/www/nginx-default;	#     web_root
	...

	location / {
		root   $web_root;
		index  index.html index.htm;
	}

	location ~ .*\.cgi$ {
		gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
		fastcgi_pass  unix:/tmp/cgiwrap-dispatch.sock;


		fastcgi_index index.cgi;
		fastcgi_param SCRIPT_FILENAME  $web_root$fastcgi_script_name;
		fastcgi_param QUERY_STRING     $query_string;
		fastcgi_param REQUEST_METHOD   $request_method;
		fastcgi_param CONTENT_TYPE     $content_type;
		fastcgi_param CONTENT_LENGTH   $content_length;
		fastcgi_param GATEWAY_INTERFACE  CGI/1.1;
		fastcgi_param SERVER_SOFTWARE    nginx;
		fastcgi_param SCRIPT_NAME        $fastcgi_script_name;
		fastcgi_param REQUEST_URI        $request_uri;
		fastcgi_param DOCUMENT_URI       $document_uri;
		fastcgi_param DOCUMENT_ROOT      $web_root;
		fastcgi_param SERVER_PROTOCOL    $server_protocol;
		fastcgi_param REMOTE_ADDR        $remote_addr;
		fastcgi_param REMOTE_PORT        $remote_port;
		fastcgi_param SERVER_ADDR        $server_addr;
		fastcgi_param SERVER_PORT        $server_port;
		fastcgi_param SERVER_NAME        $server_name;
		#include /root/hd1/conf.d/nginx/fcgi-parms
	}

    테스트:
    웹 루트 디 렉 터 리 에 다음 발 을 저장 하고 브 라 우 저 로 접근 합 니 다.
    cgi-test.cgi
#!/usr/bin/perl

print "Content-type: text/html

"; print "<html><body>Hello, world.</body></html>";

     http://localhost/cgi-test.cgi
    cgi-test-python.cgi
#!/usr/bin/python


print "Content-type: text/html

" print "<html><body>Hello, world. Hello, Python.</body></html>"

     http://localhost/cgi-test-python.cgi
    
    참고:
http://wiki.nginx.org/NginxSimpleCGIcgi
Nginx + nagios +perl fcgi

     실전 Nginx 와 PHP (FastCGI) 의 설치, 설정 과 최적화
     AWSTATS 를 위해 NGINX 에 FASTCGI 방식 의 PERL 지탱 을 추가 합 니 다.
    
글 이 끝나 면 프로그래머 들 의 우스갯소리 어록 을 공유 하 겠 습 니 다. 프로그램 언어 는 CLIPPER 프로그래머 들 이 코끼리 를 사냥 하지 않 고 코끼리 부분의 라 이브 러 리 를 구 매 한 후에 몇 년 동안 종합 하려 고 합 니 다.DBASE 프로 그 래머 는 밤 에 만 코끼리 를 사냥 했다. 왜냐하면 그 때 는 아무 도 그들 이 아직도 석궁 을 사용 하고 있다 는 것 을 알 아차 리 지 못 했 기 때문이다.FOXPRO 프로그래머 들 은 더 좋 은 소총 을 사용 하기 시 작 했 고 이 는 실제 사냥 보다 더 많은 시간 을 들 여 새로운 사격 기술 을 배 웠 다.C 프로그래머 는 직접 소총 을 구 매 하 는 것 을 거절 하고 강철 파이프 와 이동 식 기계 작업장 을 가지 고 아프리카 로 가 는 것 이 낫다. 제로 부터 완벽 한 소총 을 만 들 려 고 한다.파 라 독 스 프로그래머 는 아프리카 에 갔 을 때 할리우드 의 코끼리 사냥 에 관 한 영화 시 나리 오 를 가지 고 있 었 다. 그들 은 대본 대로 하면 코끼리 한 마 리 를 잡 을 수 있다 고 생각 했다.ACCESS 프로 그 래머 는 코끼리 사냥 경험 이 전혀 없 는 상태 에서 출발 했다. 화려 한 사냥 복 을 입고 장 비 를 모두 갖 춘 채 아름 다운 망원경 으로 코끼리 를 찾 은 뒤 방 아 쇠 를 잊 어 버 렸 다 는 것 을 알 아 차 렸 다.RBASE 프로 그 래머 는 코끼리 보다 더 드물다. 사실 코끼리 한 마리 가 RBASE 프로 그 래머 를 본다 면 그 에 게 행운 의 날 이다.VISUAL ACCESS 프로그래머 가 총알 을 장전 하고 소총 을 들 고 코끼리 를 조준 하 는 것 은 누가 도망 가 는 지 우 스 운 일이 다.그들 은 코끼리 를 잡 을 수 없 었 다. 다 중 제어 에 대한 선 호 로 지프 가 핸들 이 너무 많아 운전 을 할 수 없 었 다.ADA, APL, FORTRAN 프로 그 래머 는 산타클로스 와 선녀 처럼 허구 다.코 볼 프로그래머 는 자신 과 마찬가지 로 멸종 위기 에 처 한 코끼리 에 깊 은 동정 을 보 냈 다.

좋은 웹페이지 즐겨찾기