Hey, I'm having problems setting up Perl to work with Nginx. I have not found many clear tutorials so I'm just doing trial and error. I've connected up the Perl Wrapper, Nginx config and have installed FCGI and of course Perl.
This is my Perl Wrapper - /usr/local/bin/cgiwrap-fcgi.pl
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#!/usr/bin/perl
use strict;
use diagnostics;
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 {
my $req_params;
my $socket = FCGI::OpenSocket( "127.0.0.1:8999", 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!!
my $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \$req_params, $socket );
if ($request) { request_loop($request, $req_params)};
FCGI::CloseSocket( $socket );
}
sub request_loop {
my $request = $_[0];
my %req_params = $_[1];
while( $request->Accept() >= 0 ) {
#processing any STDIN input from WebServer (for CGI-POST actions)
my $stdin_passthrough = '';
my $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 my $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";
}
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
This is my nginx Configuration file
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
server {
listen 82;
server_name localhost;
root /srv/www/perl/public_html;
location / {
index index.html index.htm;
}
location ~ ^/cgi-bin/.*\.cgi$ {
gzip off;
fastcgi_pass 127.0.0.1:8999;
fastcgi_param SCRIPT_FILENAME /srv/www/perl/public_html$fastcgi_script_name;
include fastcgi_params;
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
My error_log does display some errors when I open up a Perl file on my browser. These are the errors I receive...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2011/09/29 16:43:07 [error] 14275#0: *1 FastCGI sent in stderr: "Undefined subroutine &main::__NR_dup2 called at /usr/lib/perl/5.10/bits/syscall.ph line 82" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /cgi-bin/index.cgi HTTP/1.1", upstream: "fastcgi://127.0.0.1:8999", host: "localhost:82"
2011/09/29 16:43:07 [error] 14275#0: *1 upstream closed prematurely FastCGI stdout while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /cgi-bin/index.cgi HTTP/1.1", upstream: "fastcgi://127.0.0.1:8999", host: "localhost:82"
Can you explain what in earth is going on? I cannot figure it out - it's becoming annoying.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------