Lighttpd Setup CGI-BIG CGI For Perl Programs

last updated in Categories CentOS, Debian Linux, FreeBSD, Gentoo Linux, lighttpd, Linux, Perl, programming, RedHat/Fedora Linux, UNIX
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/ (DocumentRoot), create cgi-bin as follows:
# mkdir -p /home/lighttpd/

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"]  =~ "" {
  server.document-root = "/home/lighttpd/"
  accesslog.filename         = "/var/log/lighttpd/"
  $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/

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

Save and execute the program (

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.


23 comment

    1. Check for directory permission and set +x permission on your script:
      chmod +x

      Also, look at your error log file.

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

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

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

  4. 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”] =~ “” {
    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/ is 755.

    Clicking on 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: – [02/Aug/2009:13:53:29 -0700] “GET /cgi-bin/ HTTP/1.1” 404 345 “-” “Mozilla/5.0 (X11; U; Linux i686; en-US; rv: Gecko/2009042315 Firefox/3.0.10”

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

  5. I just turned ON the debug and noticed that it was trying to run /var/www/html/cgi-bin/, instead of /var/www/cgi-bin/ 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/”

      with this one:

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

  6. 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?

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

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

  9. 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/
    ScriptAlias /cgi-bin/ /www/cgi-bin/

Leave a Comment