Nginx 运行perl-cgi脚本配置

 1. 首先安装 perl 跟 FastCGI 支持模块

#wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.67.tar.gz
#tar zxvf FCGI-0.67.tar.gz
#cd FCGI-0.67
# perl Makefile.PL
#make && make install
--------------------------------------------------------------------------------------------------
2.   配置 perl  FastCGI 的脚本:
将脚本保存为 perl-fastcgi.pl  放 /usr/bin 下  vi /usr/bin/perl-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( "/usr/local/webserver/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";
            }
 
        }
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
注意: 将 $socket = FCGI::OpenSocket( "/usr/local/webserver/nginx/perl_cgi-dispatch.sock", 10 );   中的地址改成你自己的地址
 
保存完毕后 
 
赋予 perl-fastcgi.pl 执行权限   chmod x perl-fastcgi.pl   
 
并运行文件,运行后将会生成 perl_cgi-dispatch.sock 文件。
 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
3.  修改nginx的配置文件 nginx.conf     在配置文件中 增加  location 支持Cgi 的文件
--------------------------------------------------------------------------------------------------------------------------   
location ~ \.cgi$
    {
       fastcgi_pass    unix:/usr/local/webserver/nginx/perl_cgi-dispatch.sock;
       fastcgi_index   index.cgi;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include    fastcgi_params;
 }
----------------------------------------------------------------------------------------------------------------------------
保存完毕后  然后重启 Nginx 之后
 
建一个 CGI文件测试一下
----------------------------------------------------
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world.";
-----------------------------------------------------
 
 
 

你可能感兴趣的:(perl-cgi)