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).
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop












{ 22 comments… read them below or add one }
thanks mate, works sweet as
Can I enable CGI globally by entering:
lighty-enable-mod cgi
and restarting Lighttpd ?
Thanks for the info… it works like a charm,
A life saver!
Thank you.
Thank you!
Trying this sample I got 403 Forbidden from lighttpd.
Would you please, explain why?
Thanks again.
Check for directory permission and set +x permission on your script:
chmod +x script.plAlso, look at your error log file.
Thanks Vivek,
The problem has been solved by reading POST data from stdin by cgi script.
Thanks.
why using the so fast lighttpd when you are using the so slow perl… in 2009, it’s really pathetic still using perl…
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.
@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?
Really easy and fin tutorial :)
Works fine for me :)
Mostly worked well. In gentoo, I had to add this line to get it to work:
include “mod_cgi.conf”
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.
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.
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”
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?
Hi All,
Need ur help. I m new in this cgi stuff and faling again and again
@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
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.
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 http://188.61.81.120 it get an 403 Forbidden message.
How could I make it to work also from the outside?
/g..
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/
Sorry, I confused installing setup on cgi-bin folder for powersek program. please help me…
thanks