Nginx and Perl on Arch Linux

Hello,

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

That looks like a perl error to me. Whats the contents of your fastcgi-wrapper.pl ?

@obs:

That looks like a perl error to me. Whats the contents of your fastcgi-wrapper.pl ?
Exactly as here

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> 

Hrmm I assume you installed the arch equivalent of libfcgi-perl ? What's your perl version?

@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.

Hrmm well my bright ideas are wearing thin, all I can suggest is try perl 5.12.2

@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.

Hrmm yes works for me on my ubuntu box running perl 5.10..so maybe a downgrade of perl is in order if the upgrade doesn't work?

Also..have you ensured all your cpan modules are up to date?

Reply

Please enter an answer
Tips:

You can mention users to notify them: @username

You can use Markdown to format your question. For more examples see the Markdown Cheatsheet.

> I’m a blockquote.

I’m a blockquote.

[I'm a link] (https://www.google.com)

I'm a link

**I am bold** I am bold

*I am italicized* I am italicized

Community Code of Conduct