Lighttpd Setup CGI-BIG CGI For Perl Programs

Posted on in Categories CentOS, Debian Linux, FreeBSD, Gentoo Linux, lighttpd, Linux, Perl, programming, RedHat/Fedora Linux, UNIX last updated July 29, 2006
Lighttpd logo

Lighttpd has mod_cgi module that allows you running Perl and other server side programs via cgi-bin directory. The Common Gateway Interface (CGI) is a standard protocol for interfacing external application software with an information server.

Step #1: Create a CGI cgi-bin Directory

First you need to create a cgi-bin directory for your domain. Assuming that your domain hosted at /home/lighttpd/theos.in/http (DocumentRoot), create cgi-bin as follows:
# mkdir -p /home/lighttpd/theos.in/cgi-bin

Step # 2: Load mod_cgi Module

Open lighttpd configuration file using a text editor such as vi:
# vi /etc/lighttpd/ligttpd.conf

Now append or modify text as follows so that support for mod_cgi get loaded:

server.modules += ( "mod_cgi" )

Find out your virtual server configuration and append the following:

$HTTP["url"] =~ "/cgi-bin/" {
      cgi.assign = ( ".pl" => "/usr/bin/perl" )
}

Here is complete my config code:

$HTTP["host"]  =~ "theos.in" {
  server.document-root = "/home/lighttpd/theos.in/http"
  accesslog.filename         = "/var/log/lighttpd/theos.in/access.log"
  $HTTP["url"] =~ "/cgi-bin/" {
      cgi.assign = ( ".pl" => "/usr/bin/perl" )
  }
}

Step # 3:Restart the Lighttpd

Restart lighttpd webserver, enter:
# /etc/init.d/lighttpd restart

Step # 4: Test It

Create a file/perl program in /home/lighttpd/theos.in/cgi-bin/sample.pl:

#!/usr/bin/perl
print "Content-Type: text/plain", "\n\n";
print "Hi there! This is a sample perl program!!!", "\n";

Save and execute the program (http://yourdomain.com/cgi-bin/sample.pl).

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

23 comment

  1. Thank you!

    Trying this sample I got 403 Forbidden from lighttpd.

    Would you please, explain why?

    Thanks again.

  2. Thanks Vivek,

    The problem has been solved by reading POST data from stdin by cgi script.

    Thanks.

  3. why using the so fast lighttpd when you are using the so slow perl… in 2009, it’s really pathetic still using perl…

  4. thank you for the post. nginx has a limited embed implementation as well, alternatively you can wrap cgi for it and run Perl inside.
    @nobody for many reasons too numerous to write down here.

  5. @nobody and @twit Friendly The “so slow perl” is probably due to your inability to program it properly. The only thing faster then perl is mod_perl! Why don’t you use PHP. It’s a dumbed down version of perl and might be more to your speed.

    Can anyone explain why it gives a 500 Internal Server Error?

  6. Mostly worked well. In gentoo, I had to add this line to get it to work:
    include “mod_cgi.conf”

  7. I just installed lightppd on Mandriva Linux 2008, and added following to /etc/lighttpd/lighttpd.conf, and restarted lighttpd:

    server.modules += ( “mod_cgi” )
    $HTTP[“host”] =~ “127.0.0.1” {
    server.document-root = “/var/www/html”
    accesslog.filename = “/var/log/lighttpd/access.log”
    $HTTP[“url”] =~ “/cgi-bin” {
    cgi.assign = ( “.pl” => “/usr/bin/perl” )
    }
    }

    /var/www/cgi-bin/test.pl is 755.

    Clicking on http://127.0.0.1/cgi-bin/test.pl gives “404 – Not Found”. Would you happen to know why? /var/log/lighttpd/error.log does not show anything, but /var/log/lighttpd/access.log has an entry:
    127.0.0.1 127.0.0.1 – [02/Aug/2009:13:53:29 -0700] “GET /cgi-bin/test.pl HTTP/1.1” 404 345 “-” “Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10”

    I have tried replacing 127.0.0.1 with localhost in the line ‘$HTTP[“host”] =~ “127.0.0.1” {‘, but that did not help either.

  8. I just turned ON the debug and noticed that it was trying to run /var/www/html/cgi-bin/test.pl, instead of /var/www/cgi-bin/test.pl. Changing server.document-root = “/var/www/html” to “/var/www” fixed it.

    1. I had this same problem, too. Indeed, the author’s configuration file should replace this entry:

      server.document-root = “/home/lighttpd/theos.in/http”

      with this one:

      server.document-root = “/home/lighttpd/theos.in”

  9. I have lighttpd running fine with cgi scripts form localhost/cgi-bin.
    I would like to use however, cgi scripts from any directory (i.e. globally), a desire which echoes an earlier post. I can’t find informaton on this, and cannot figure it out.
    Any ideas?

  10. @Nishu
    CHeck wher eyour perl distribution is located from in your bash path, if on Unix or Linux:

    In terminal: type

    $ which perl

    Your path might not be usr/bin/perl

  11. If you have cgi programs that are written in C how do you set it up? I have a bunch of C based code that is directly executable and I want to be able to execute from the web.

  12. Does not show how to specify the cgi-bin.

    e.g in Apache I have the cgi-bin located elsewhere (on a separate partition)
    DocumentRoot /www/admin.example.com/
    …….
    ScriptAlias /cgi-bin/ /www/cgi-bin/admin.example.com/

Comments are closed.