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:
- Browser trying to download the .pl file instead of executing and giving out the result.
- Forbidden.
- 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 apache2
Step 2: Install mod_perl
Step 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:
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.Apache is only configured to run CGIs from a dedicated
cgi-bin
directory. Solution: Move the CGI program there or add anAddHandler cgi-script .cgi
statement to httpd.conf.The CGI program is not set as executable. Solution (assuming a *nix-type operating system):
chmod +x my_prog.cgi
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/
.