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 프로 그 래머 는 산타클로스 와 선녀 처럼 허구 다.코 볼 프로그래머 는 자신 과 마찬가지 로 멸종 위기 에 처 한 코끼리 에 깊 은 동정 을 보 냈 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.