apache configration
configurationserverwebserverapache-configration

cgi scripts

These can be written in any language, but in most cases perl is used. See 'testing' to get an idea of the requirements a cgi script must meet independant of its language. In order to run scripts apache has the mod_cgi script, which can be an external module or compiled in. If it is an external module it must be activated like so:

/etc/httpd/conf/httpd.conf

LoadModule cgi_module modules/mod_cgi.so # do not mix this up with mod_cgid

We also need to configure where cgi scripts are allowed to be executed. the criteria can be a path or a file extension and if you have an AllowOverride All directive in your httpd.conf you can also use a .htaccess-file to tell apache which files are cgi scripts. In the first case this is done by defining a ScriptAlias, a path in which only cgi-scripts are allowed to be, because anything will get exected. I do not like this at all. You better specify AddHandler cgi-script pl cgi in a .htaccess in the folder where your scripts are or in the main configuration for that folder, which might look something like this:

/etc/httpd/conf/extras/zpool.conf

Alias /public "/mnt/zpool/data/public"

       Options Indexes FollowSymLinks MultiViews ExecCGI
       AllowOverride All
       Order allow,deny
       Allow from all

testing

Apache expects cgi-scripts to return a http header. To test your configuration you can write a program in any language to return:

content-type: text/html\n\n
this is a test

and append its extension to the list of cgi scripts, e.g. using a minimal .htaccess-file:

.htaccess

Options Indexes ExecCGI
AddHandler cgi-script pl cgi

I like having these scripts laying around for testing after a set up:

#!/usr/bin/perl
# test.pl
print qq[content-type: text/htmlnn];
print qq[this is a test];
<!-- test.php -->
<?php
  phpinfo();
?>
// test.c

#include <stdio.h>
int main()
{
  puts("content-type: text/htmlnn");
  puts("this is a test");
}

# gcc -Wall -o test.cgi test.c
# chmod g-w test.cgi
# if you are using SELinux you might also be interested in setting:
# chcon unconfined_u:object_r:httpd_sys_content_t:s0 test.cgi
top