Nginx and Perl on Arch Linux
I'm running an almost new installation of Arch on a Linode 512.
I have Nginx configured to serve PHP as per the instructions in the LEMP section of the library. However, I am also trying to get Perl to work but am having some problems.
As there is no guide for configuring Perl with FastCGI on Arch, I tried to adapt one of the guides for a different OS. However, when I run
/usr/bin/fastcgi-wrapper.pl
I get the following error:
Illegal declaration of subroutine main::__INT16_C at /usr/lib/perl5/site_perl/_h2ph_pre.ph line 160.
Compilation failed in require at /usr/lib/perl5/site_perl/syscall.ph line 1.
Compilation failed in require at /usr/bin/fastcgi-wrapper.pl line 7.
Could anyone shed any light on the problem?
Thanks.
7 Replies
@obs:
That looks like a perl error to me. Whats the contents of your fastcgi-wrapper.pl ?
Exactly ashere
That is:
#!/usr/bin/perl
use FCGI;
use Socket;
use POSIX qw(setsid);
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", 200 ); #use IP sockets
$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 - ";
print "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 ";
print "exist or is not executable by this process.\n";
}
}
}</kid_to_read>
@obs:
Hrmm I assume you installed the arch equivalent of libfcgi-perl ? What's your perl version?
This is perl 5, version 12, subversion 1 (v5.12.1) built for i686-linux-thread-multi
Yes, I have perl-fcgi installed.
@obs:
Hrmm well my bright ideas are wearing thin, all I can suggest is try perl 5.12.2
Thanks for the help regardless:)
I tried running a the script:
#!/usr/bin/perl
require 'syscall.ph'
On my friend's Debian VPS, on Perl version:
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
It runs fine. It causes the previously mentioned error with my setup. This does indeed seem to indicate that it's something to do with my version of Perl. I'll try some other versions and see what happens.