Nginx 运行perl-cgi脚本配置

时间:16-08-16 来源: 作者: 点击:

Nginx 运行perl-cgi脚本配置

Nginx 运行perl-cgi脚本配置

[摘要:1. 起首装置 perl 跟 FastCGI 支撑模块 #wget #tar zxvf FCGI-0.67.tar.gz #cd FCGI-0.67 # perl Makefile.PL #make make install -------------------------------------------------]

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

#wget

#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 "fakeexitnrc=".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/plainrnrn");

                        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/plainrnrn");

                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/htmlnn";

print "Hello, world.";

-----------------------------------------------------

 

 

 

本文出自 “学习之路” 博客,请务必保留此出处

相关推荐

感谢关注 Ithao123Perl频道,ithao123.cn是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!


关键词: perl-cgi


文章点评:

精选专题

Laravel入门教程

Laravel入门教程

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

hadoop学习及应用

hadoop学习及应用

声明:本文转载于网络,文章链接:http://www.nd9p.com/5857.html