日期:2011-05-26 22:59:00  来源:本站整理

配置Nginx 运行CGI(Perl-cgi)[服务器安全]

赞助商链接



  本文“配置Nginx 运行CGI(Perl-cgi)[服务器安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

笔者的nginx安装目录为/usr/local/nginx

虚拟机配置文件为/usr/local/nginx/conf/vhosts.conf

目前php fast-cgi已支持

以下操作均在su下完成

=====================

安装perl cgi模块
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

安装FCGI-ProcManager:
wget http://search.cpan.org/CPAN/authors/id/G/GB/GBJK/FCGI-ProcManager-0.18.tar.gz    
tar -xzxf FCGI-ProcManager-0.18.tar.gz     
cd FCGI-ProcManager-0.18     
perl Makefile.PL     
make      make install
===================

先在/bin目录下安排一个perl写的分发器,取名叫perl-fcgi

vi /bin/perl-cgi

#!/usr/bin/perl -w  
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);  
   
#&daemonize; we don't daemonize when running under runsv  
#this keeps the program alive or something after exec'ing perl scripts  
END()   { }  
BEGIN() { }  
{  
    no warnings;  
    *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:10081", 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!!  
    #foreach $item (keys %ENV) { delete $ENV{$item}; }  
    $proc_manager = FCGI::ProcManager->new( {n_processes => 5} );  
    #$socket = FCGI::OpenSocket( "/opt/nginx/fcgi/cgi.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,  
        &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\n\r\n");  
                print 
"Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";  
                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\n\r\n");  
            print 
"Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";  
        }  
    }  

给这个脚本履行权限

chmod +x  /bin/perl-fcgi
然后试试看可否启动
/bin/perl-cgi &
若是成功则会呈现以下信息
FastCGI: server (pid 21315): initialized
FastCGI: manager (pid 17915): server (pid 21315) started

假如碰到错误Can’t locate FCGI.pm,那么履行下面的号令

perl -MCPAN -e 'install FCGI'

perl -MCPAN -e 'install FCGI::ProcManager'

cd /usr/include; h2ph *.h */*.h

第1、二条号令是给perl安装FCGI模块,第三条是注册perl能辨认的头文件,然后重新履行/bin/perl-fcgi, 假如正常的话,那么履行:

netstat -tunlp

列表中应当呈现
tcp        0      0 127.0.0.1:10081             0.0.0.0:*                   LISTEN      5640/perl
启用分发器

/bin/perl-fcgi > /dev/null 2>&1 &
将其写入rc.local
echo "/bin/perl-fcgi > /dev/null 2>&1 &" >> /etc/rc.local
上面的方法启动后perl-fcgi是以履行它的用户身份运行的,关于web程序来说这是很不利的.老外用perl写了一个脚本Noah Friedman可以用指定的用户来运行某个程序,源程序在这里,这里也贴出来便利查阅vi /sbin/runas

  1. #!/bin/sh   
  2. exec ${PERL-perl} -Swx $0 ${1+"$@"}   
  3. #!perl        [perl will skip all lines in this file before this line]   
  4.     
  5. # with --- run program with special properties   
  6.     
  7. # Copyright (C) 1995, 2000, 2002 Noah S. Friedman   
  8.     
  9. # Author: Noah Friedman <friedman@splode.com>   
  10. # Created: 1995-08-14   
  11.     
  12. # $Id: with,v 1.12 2004/02/16 22:51:49 friedman Exp $   
  13.     
  14. # This program is free software; you can redistribute it and/or modify   
  15. # it under the terms of the GNU General Public License as published by   
  16. # the Free Software Foundation; either version 2, or (at your option)   
  17. # any later version.   
  18. #   
  19. # This program is distributed in the hope that it will be useful,   
  20. # but WITHOUT ANY WARRANTY; without even the implied warranty of   
  21. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   
  22. # GNU General Public License for more details.   
  23. #   
  24. # You should have received a copy of the GNU General Public License   
  25. # along with this program; if not, you can either send email to this   
  26. # program's maintainer or write to: The Free Software Foundation,   
  27. # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.   
  28.     
  29. # Commentary:   
  30.     
  31. # TODO: create optional socket streams for stdin or stdout before invoking   
  32. # subprocess.   
  33.     
  34. # Code:   
  35.     
  36. use Getopt::Long;   
  37. use POSIX qw(setsid);   
  38. use Symbol;   
  39. use strict;   
  40.     
  41. (my $progname = $0) =~ s|.*/||;   
  42. my $bgfn;   
  43. my $bgopt = 0;   
  44.     
  45. my $opt_cwd;   
  46. my $opt_egid;   
  47. my $opt_euid;   
  48. my $opt_gid;   
  49. my $opt_groups;   
  50. my @opt_include;   
  51. my $opt_name;   
  52. my $opt_pgrp;   
  53. my $opt_priority;   
  54. my $opt_root;   
  55. my $opt_uid;   
  56. my $opt_umask;   
  57. my $opt_foreground = 0;   
  58.     
  59. sub err   
  60. {   
  61.   my $fh = (ref ($_[0]) ? shift : *STDERR{IO});   
  62.   print $fh join (": ", $progname, @_), "\n";   
  63.   exit (1);   
  64. }   
  65.     
  66. sub get_includes   
  67. {   
  68.   unshift @INC, @_;   
  69.   push (@INC,   
  70.         "$ENV{HOME}/lib/perl",   
  71.         "$ENV{HOME}/lib/perl/include");   
  72.     
  73.   eval { require "syscall.ph" } if defined $opt_groups;   
  74. }   
  75.     
  76. sub numberp   
  77. {   
  78.   defined $_[0] && $_[0] =~ m/^-?\d+$/o;   
  79. }   
  80.     
  81. sub group2gid   
  82. {   
  83.   my $g = shift;   
  84.   return $g if numberp ($g);   
  85.   my $gid = getgrnam ($g);   
  86.   return $gid if defined $gid && numberp ($gid);   
  87.   err ($g, "no such group");   
  88. }   
  89.     
  90. sub user2uid   
  91. {   
  92.   my $u = shift;   
  93.   return $u if numberp ($u);   
  94.   my $uid = getpwnam ($u);   
  95.   return $uid if defined $uid && numberp ($uid);   
  96.   err ($u, "no such user");   
  97. }   
  98.     
  99. sub set_cwd   
  100. {   
  101.   my $d = shift;   
  102.   chdir ($d) || err ("chdir", $d, $!);   
  103. }   
  104.     
  105. sub set_egid   
  106. {   
  107.   my $sgid = group2gid (shift);   
  108.   my $egid = $) + 0;   
  109.     
  110.   $) = $sgid;   
  111.   err ($sgid, "cannot set egid", $!) if ($) == $egid && $egid != $sgid);   
  112. }   
  113.     
  114. sub set_gid   
  115. {   
  116.   my $sgid = group2gid (shift);   
  117.   my $rgid = $( + 0;   
  118.   my $egid = $) + 0;   
  119.     
  120.   $( = $sgid;   
  121.   $) = $sgid;   
  122.   err ($sgid, "cannot set rgid", $!) if ($( == $rgid && $rgid != $sgid);   
  123.   err ($sgid, "cannot set egid", $!) if ($) == $egid && $egid != $sgid);   
  124. }   
  125.     
  126. sub big_endian_p   
  127. {   
  128.   my $x = 1;   
  129.   my @y = unpack ("c2", pack ("i", $x));   
  130.   return ($y[0] == 1) ? 0 : 1;   
  131. }   
  132.     
  133. # This function is more complex than it ought to be because perl does not   
  134. # export the setgroups function.  It exports the getgroups function by   
  135. # making $( and $) return multiple values in the form of a space-separated   
  136. # string, but you cannot *set* the group list by assigning those variables.   
  137. # There is no portable way to determine what size gid_t is, so we must guess.   
  138. sub set_groups   
  139. {   
  140.   my @glist = sort { $a <=> $b } map { group2gid ($_) } split (/[ ,]/, shift);   
  141.     
  142.   my $expected = join (" ", $(+0, reverse @glist);   
  143.   my @p = (big_endian_p() ? ("n""N""i") : ("v""V""i"));   
  144.     
  145.   for my $c (@p)   
  146.     {   
  147.       err ("setgroups", $!)   
  148.         if (syscall (&SYS_setgroups, @glist+0, pack ("$c*", @glist)) == -1);   
  149.       return if ("$(" eq $expected);   
  150.     }   
  151.   err ("setgroups""Could not determine gid_t");   
  152. }   
  153.     
  154. sub set_pgrp   
  155. {   
  156.   setpgrp ($$, shift) || err ("setpgrp", $!);   
  157. }   
  158.     
  159. sub set_priority   
  160. {   
  161.   my $prio = shift () + 0;   
  162.   setpriority (00, $prio) || err ("setpriority", $prio, $!);   
  163. }   
  164.     
  165. sub set_root   
  166. {   
  167.   my $d = shift;   
  168.   chroot ($d) || err ("chroot", $d, $!);   
  169.   chdir ("/");   
  170. }   
  171.     
  172. sub set_euid   
  173. {   
  174.   my $suid = user2uid (shift);   
  175.   my $euid = $>;   
  176.     
  177.   $> = $suid;   
  178.   err ($suid, "cannot set euid", $!) if ($> == $euid && $euid != $suid);   
  179. }   
  180.     
  181. sub set_uid   
  182. {   
  183.   my $suid = user2uid (shift);   
  184.   my $ruid = $<;   
  185.   my $euid = $>;   
  186.     
  187.   $< = $suid;   
  188.   $> = $suid;   
  189.   err ($suid, "cannot set ruid", $!) if ($< == $ruid && $ruid != $suid);   
  190.   err ($suid, "cannot set euid", $!) if ($> == $euid && $euid != $suid);   
  191. }   
  192.     
  193.   
  194. sub background   
  195. {   
  196.   my $pid = fork;   
  197.   die "$@" if $pid < 0;   
  198.   if ($pid == 0)   
  199.     {   
  200.       # Backgrounded programs may expect to be able to read input from the   
  201.       # user if stdin is a tty, but we will no longer have any job control   
  202.       # management because of the double fork and exit.  This can result in   
  203.       # a program either blocking on input (if still associated with a   
  204.       # controlling terminal) and stopping, or stealing input from a   
  205.       # foreground process (e.g. a shell).  So redirect stdin to /dev/null.   
  206.       open (STDIN, "< /dev/null"if (-t STDIN);   
  207.       return *STDERR{IO};   
  208.     }   
  209.     
  210.   exit (0) unless $opt_foreground;   
  211.   wait;   
  212.   exit ($?);   
  213. }   
  214.     
  215. sub dosetsid   
  216. {   
  217.   background ();   
  218.   setsid (); # dissociate from controlling terminal   
  219.   return *STDERR{IO};   
  220. }   
  221.     
  222. sub daemon   
  223. {   
  224.   # Don't allow any file descriptors, including stdin, stdout, or   
  225.   # stderr to be propagated to children.   
  226.   $^F = -1;   
  227.   dosetsid ();   
  228.   # Duped in case we've closed stderr but can't exec anything.   
  229.   my $saved_stderr = gensym;   
  230.   open ($saved_stderr, ">&STDERR");   
  231.   close (STDERR);   
  232.   close (STDOUT);   
  233.   close (STDIN);   
  234.   return $saved_stderr;   
  235. }   
  236.     
  237. sub notty   
  238. {   
  239.   # Don't allow any file descriptors other than stdin, stdout, or stderr to   
  240.   # be propagated to children.   
  241.   $^F = 2;   
  242.   dosetsid ();   
  243.   # Duped in case we've closed stderr but can't exec anything.   
  244.   my $saved_stderr = gensym;   
  245.   open ($saved_stderr, ">&STDERR");   
  246.   open (STDIN,  "+</dev/null");   
  247.   open (STDERR, "+<&STDIN");   
  248.   open (STDOUT, "+<&STDIN");   
  249.   return $saved_stderr;   
  250. }   
  251.     
  252.   
  253. sub set_bg_option   
  254. {   
  255.   my %bgfntbl =   
  256.     ( 1 => \&background,   
  257.       2 => \&daemon,   
  258.       4 => \?ty,   
  259.       8 => \&dosetsid,   
  260.     );   
  261.     
  262.   $bgopt = $_[0];   
  263.   $bgfn  = $bgfntbl{$bgopt};   
  264. }   
  265.     
  266. sub parse_options   
  267. {   
  268.   Getopt::Long::config (qw(bundling autoabbrev require_order));   
  269.   my $succ = GetOptions   
  270.     ("h|help",          sub { usage () },   
  271.      "c|cwd=s",         \$opt_cwd,   
  272.      "d|display=s",     \$ENV{DISPLAY},   
  273.      "H|home=s",        \$ENV{HOME},   
  274.      "G|egid=s",        \$opt_egid,   
  275.      "g|gid=s",         \$opt_gid,   
  276.      "I|include=s@",    \@opt_include,   
  277.      "l|groups=s",      \$opt_groups,   
  278.      "m|umask=s",       \$opt_umask,   
  279.      "n|name=s",        \$opt_name,   
  280.      "P|priority=i",    \$opt_priority,   
  281.      "p|pgrp=i",        \$opt_pgrp,   
  282.      "r|root=s",        \$opt_root,   
  283.      "U|euid=s",        \$opt_euid,   
  284.      "u|uid=s",         \$opt_uid,   
  285.     
  286.      "f|fg|foreground", \$opt_foreground,   
  287.     
  288.      "b|bg|background", sub { set_bg_option (1); $opt_foreground = 0 },   
  289.      "a|daemon|demon",  sub { set_bg_option (2) },   
  290.      "N|no-tty|notty",  sub { set_bg_option (4) },   
  291.      "s|setsid",        sub { set_bg_option (8) },   
  292.     );   
  293.   usage () unless $succ;   
  294.     
  295.   my $n = 0;   
  296.   do { $n++ if $bgopt & 1 } while ($bgopt >>= 1);   
  297.   err ("Can only specify one of --background, --daemon, --notty, or --setsid")   
  298.     if ($n > 1);   
  299. }   
  300.     
  301. sub usage   
  302. {   
  303.   print STDERR "$progname: @_\n\n" if @_;   
  304.   print STDERR "Usage: $progname {options} [command {args...}]\n Options are: -h, --help            You're looking at it. -D, --debug           Turn on interactive debugging in perl. -I, --include   DIR   Include DIR in \@INC path for perl.                       This option may be specified multiple times to append                       search paths to perl.   -d, --display   DISP  Run with DISP as the X server display. -H, --home      HOME  Set \$HOME. -n, --name      ARGV0 Set name of running program (argv[0]).   -c, --cwd       DIR   Run with DIR as the current working directory.                       This directory is relative to the root directory as                       specified by \`--root', or \`/'. -r, --root      ROOT  Set root directory (via \`chroot' syscall) to ROOT.   -G, --egid      EGID  Set \`effective' group ID. -g, --gid       GID   Set both \`real' and \`effective' group ID. -l, --groups    GLIST Set group list to comma-separated GLIST. -U, --euid      EUID  Set \`effective' user ID. -u, --uid       UID   Set both \`real' and \`effective' user ID.   -m, --umask     UMASK Set umask. -P, --priority  NICE  Set scheduling priority to NICE (-20 to 20). -p, --pgrp      PGRP  Set process group.   The following options cause the resulting process to be backgrounded automatically but differ in various ways:   -b, --background      Run process in background.  This is the default with                       the --daemon, --no-tty, and --setsid options.   -f, --foreground      Do not put process into the background when using                       the --daemon, --no-tty, and --setsid options.                       In all other cases the default is to remain in the                       foreground.   -a, --daemon          Run process in \"daemon\" mode.                       This closes stdin, stdout, and stderr, dissociates                       the process from any controlling terminal, and                       backgrounds the process.   -N, --no-tty          Run process in background with no controlling                       terminal and with stdin, stdout, and stderr                       redirected to /dev/null.   -s, --setsid          Dissociate from controlling terminal.                       This automatically backgrounds the process but                       does not redirect any file descriptors.\n";   
  305.   exit (1);   
  306. }   
  307.     
  308. sub main   
  309. {   
  310.   parse_options ();   
  311.   usage () unless @ARGV;   
  312.     
  313.   get_includes (@opt_include);   
  314.     
  315.   umask        (oct ($opt_umask)) if defined $opt_umask;   
  316.   set_gid      ($opt_gid)         if defined $opt_gid;   
  317.   set_egid     ($opt_egid)        if defined $opt_egid;   
  318.   set_groups   ($opt_groups)      if defined $opt_groups;   
  319.   set_root     ($opt_root)        if defined $opt_root;   
  320.   set_cwd      ($opt_cwd)         if defined $opt_cwd;   
  321.   set_priority ($opt_priority)    if defined $opt_priority;   
  322.   set_uid      ($opt_uid)         if defined $opt_uid;   
  323.   set_euid     ($opt_euid)        if defined $opt_euid;   
  324.     
  325.   my $stderr = $bgfn ? &$bgfn () : *STDERR{IO};   
  326.     
  327.   my $runprog = $ARGV[0];   
  328.   if ($opt_name)   
  329.     {   
  330.       shift   @ARGV;   
  331.       unshift @ARGV, $opt_name;   
  332.     }   
  333.   local $^W = 0# avoid implicit warnings from exec   
  334.   exec ($runprog @ARGV) || err ($stderr, "exec", $runprog, $!);   
  335. }   
  336.     
  337. main ();   
  338.     
  339. # local variables:   
  340. # mode: perl   
  341. # eval: (auto-fill-mode 1)   
  342. # end:   
  343.     
  344. # with ends here 
  345. 我的vsftpd、nginx、php-fpm都是以nobody运行,则perl-cgi也用nobody运行
    chmod +x /sbin/runas
    runas --daemon -g nobody -u nobody /bin/perl-fcgi

    ==================
    配置nginx
    vi /usr/local/nginx/conf/fcgi_perl.conf

    1. fastcgi_pass    127.0.0.1:10081;   
    2. fastcgi_index   index.cgi;   
    3. fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;   
    4. fastcgi_param QUERY_STRING      $query_string;   
    5. fastcgi_param REQUEST_METHOD    $request_method;   
    6. fastcgi_param CONTENT_TYPE      $content_type;   
    7. fastcgi_param CONTENT_LENGTH    $content_length;   
    8. fastcgi_param GATEWAY_INTERFACE CGI/1.1;   
    9. fastcgi_param SERVER_SOFTWARE   nginx;   
    10. fastcgi_param SCRIPT_NAME       $fastcgi_script_name;   
    11. fastcgi_param REQUEST_URI       $request_uri;   
    12. fastcgi_param DOCUMENT_URI      $document_uri;   
    13. fastcgi_param DOCUMENT_ROOT     $document_root;   
    14. fastcgi_param SERVER_PROTOCOL   $server_protocol;   
    15. fastcgi_param REMOTE_ADDR       $remote_addr;   
    16. fastcgi_param REMOTE_PORT       $remote_port;   
    17. fastcgi_param SERVER_ADDR       $server_addr;   
    18. fastcgi_param SERVER_PORT       $server_port;   
    19. fastcgi_param SERVER_NAME       $server_name;   
    20. fastcgi_read_timeout            60;  

    下面是一个cgi虚拟机的配置示例

    1. server {   
    2.              listen             80;   
    3.              server_name        urdomain.com;   
    4.              index              index.cgi   
    5.     
    6.              root               /var/www;   
    7.     
    8.              location ~  .*\.cgi? {   
    9.                   include         fcgi_perl.conf;   
    10.              }   
    11.      }  

    /usr/local/nginx/sbin/nginx -t
    测试OK之后重新加载nginx配置文件
    /usr/local/nginx/sbin/nginx -s reload

    enjoy it.

  以上是“配置Nginx 运行CGI(Perl-cgi)[服务器安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Ubuntu VPS环境安装配置Nginx做反向代理
  • 基于FreeBSD 8.0 Ports配置nginx+php+mysql高性能web平台
  • <b>Linux下配置Nginx + 双Tomcat负载均衡</b>
  • 配置Nginx 运行CGI(Perl-cgi)
  • 配置nginx支持php,jsp,asp,aspx
  • Linux VPS上配置Nginx反向代理
  • <b>Ubuntu VPS环境下安装配置Nginx做反向代理</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .