≡ Menu

Lighttpd Setup CGI-BIG CGI For Perl Programs

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:

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

Share this on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:

{ 23 comments… add one }
  • james August 25, 2008, 2:04 am

    thanks mate, works sweet as

  • Leszek September 25, 2008, 10:43 pm

    Can I enable CGI globally by entering:
    lighty-enable-mod cgi
    and restarting Lighttpd ?

  • Thomas Martin Klein February 8, 2009, 4:02 pm

    Thanks for the info… it works like a charm,

  • Amir March 16, 2009, 3:34 pm

    A life saver!
    Thank you.

  • Dmitry March 26, 2009, 9:30 am

    Thank you!

    Trying this sample I got 403 Forbidden from lighttpd.

    Would you please, explain why?

    Thanks again.

    • nixCraft March 26, 2009, 1:20 pm

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

      Also, look at your error log file.

  • Dmitry March 26, 2009, 3:48 pm

    Thanks Vivek,

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


  • nobody June 10, 2009, 7:19 am

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

  • Twitter Friendly June 11, 2009, 8:03 pm

    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.

  • Hawk June 12, 2009, 4:09 am

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

  • Kilbane July 13, 2009, 12:02 pm

    Really easy and fin tutorial :)
    Works fine for me :)

  • Durand July 21, 2009, 10:52 pm

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

  • NK August 2, 2009, 9:02 pm

    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/test.pl 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/test.pl 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.

  • NK August 2, 2009, 9:47 pm

    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.

    • LCN September 4, 2010, 4:37 am

      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”

  • john plumridge March 27, 2010, 3:51 pm

    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?

  • nishu April 9, 2010, 8:35 am

    Hi All,

    Need ur help. I m new in this cgi stuff and faling again and again

  • john plumridge April 23, 2010, 10:54 pm

    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

  • Luke June 6, 2010, 4:49 am

    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.

  • g.. August 25, 2011, 7:40 pm

    It works when I access the perl with a browser on the server with http://localhost/….
    However when I try to access the perl with the external IP it get an 403 Forbidden message.
    How could I make it to work also from the outside?


  • none-101 October 18, 2011, 11:08 am

    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/

  • adipa January 6, 2012, 7:43 am

    Sorry, I confused installing setup on cgi-bin folder for powersek program. please help me…

  • Razique May 24, 2013, 8:21 am

    Perfect tutorial!

Leave a Comment

   Tagged with: , , , , , , , ,