How do I configure Apache 2 to run Perl CGI scripts? How do I configure Apache 2 to run Perl CGI scripts? linux linux

How do I configure Apache 2 to run Perl CGI scripts?


This post is intended to rescue the people who are suffering from *not being able to properly setup Apache2 for Perl on Ubuntu. (The system configurations specific to your Linux machine will be mentioned within square brackets, like [this]).

Possible outcome of an improperly setup Apache 2:

  1. Browser trying to download the .pl file instead of executing and giving out the result.
  2. Forbidden.
  3. Internal server error.

If one follows the steps described below with a reasonable intelligence, he/she can get through the errors mentioned above.

Before starting the steps. Go to /etc/hosts file and add IP address / domain-name` for example:

127.0.0.1 www.BECK.com

Step 1: Install apache2Step 2: Install mod_perlStep 3: Configure apache2

open sites-available/default and add the following,

<Files ~ "\.(pl|cgi)$">    SetHandler perl-script    PerlResponseHandler ModPerl::PerlRun    Options +ExecCGI    PerlSendHeader On</Files><Directory />    Options FollowSymLinks    AllowOverride None</Directory><Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that's a story for another day. Let's concentrate on washing out the issue at hand)####    Options Indexes FollowSymLinks MultiViews    AllowOverride None    Order allow,deny    allow from all</Directory>ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]<Directory [path-where-you-want-your-.pl-and-.cgi-files]>    AllowOverride None    Options ExecCGI -MultiViews +SymLinksIfOwnerMatch    AddHandler cgi-script .pl    Order allow,deny    allow from all</Directory><Files ~ "\.(pl|cgi)$">    SetHandler perl-script    PerlResponseHandler ModPerl::PerlRun    Options +ExecCGI    PerlSendHeader On</Files><Directory />    Options FollowSymLinks    AllowOverride None</Directory><Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that's a story for another day. Let's concentrate on washing out the issue at hand)####    Options Indexes FollowSymLinks MultiViews    AllowOverride None    Order allow,deny    allow from all</Directory>ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]<Directory [path-where-you-want-your-.pl-and-.cgi-files]>    AllowOverride None    Options ExecCGI -MultiViews +SymLinksIfOwnerMatch    AddHandler cgi-script .pl    Order allow,deny    allow from all</Directory>

Step 4:

Add the following lines to your /etc/apache2/apache2.conf file.

AddHandler cgi-script .cgi .pl<Files ~ "\.pl$">Options +ExecCGI</Files><Files ~ "\.cgi$">Options +ExecCGI</Files><IfModule mod_perl.c><IfModule mod_alias.c>Alias /perl/ /home/sly/host/perl/</IfModule><Location /perl>SetHandler perl-scriptPerlHandler Apache::RegistryOptions +ExecCGI</Location></IfModule><Files ~ "\.pl$">Options +ExecCGI</Files>

Step 5:

Very important, or at least I guess so, only after doing this step, I got it to work.

AddHandler cgi-script .cgi .pl

<Files ~ "\.pl$">Options +ExecCGI</Files><Files ~ "\.cgi$">Options +ExecCGI</Files><IfModule mod_perl.c><IfModule mod_alias.c>Alias /perl/ /home/sly/host/perl/</IfModule><Location /perl>SetHandler perl-scriptPerlHandler Apache::RegistryOptions +ExecCGI</Location></IfModule><Files ~ "\.pl$">Options +ExecCGI</Files>

Step 6

Very important, or at least I guess so, only after doing this step, I got it to work.

Add the following to you /etc/apache2/sites-enabled/000-default file

<Files ~ "\.(pl|cgi)$">SetHandler perl-scriptPerlResponseHandler ModPerl::PerlRunOptions +ExecCGIPerlSendHeader On</Files>

Step 7:

Now add, your Perl script as test.pl in the place where you mentioned before in step 3 as [path-where-you-want-your-.pl-and-.cgi-files].

Give permissions to the .pl file using chmod and then, type the webaddress/cgi-bin/test.pl in the address bar of the browser, there you go, you got it.

(Now, many of the things would have been redundant in this post. Kindly ignore it.)


You'll need to take a look at your Apache error log to see what the "internal server error" is. The four most likely cases, in my experience would be:

  1. The CGI program is in a directory which does not have CGI execution enabled. Solution: Add the ExecCGI option to that directory via either httpd.conf or a .htaccess file.

  2. Apache is only configured to run CGIs from a dedicated cgi-bin directory. Solution: Move the CGI program there or add an AddHandler cgi-script .cgi statement to httpd.conf.

  3. The CGI program is not set as executable. Solution (assuming a *nix-type operating system): chmod +x my_prog.cgi

  4. The CGI program is exiting without sending headers. Solution: Run the program from the command line and verify that a) it actually runs rather than dying with a compile-time error and b) it generates the correct output, which should include, at the very minimum, a Content-Type header and a blank line following the last of its headers.


(Google search brought me to this question even though I did not ask for perl)

I had a problem with running scripts (albeit bash not perl). Apache had a config of ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ however Apache error log showed File does not exist: /var/www/cgi-bin/test.html.

Tried putting the script in both /usr/lib/cgi-bin/ and /var/www/cgi-bin/ but neither were working.

After a prolonged googling session what cracked it for me wassudo a2enmod cgi and everything fell into place using /usr/lib/cgi-bin/.