Essentially, this module allows your web server to execute CGI scripts on demand. When a client requests a file that has the extension `.cgi`, or is defined as a CGI script using the `AddHandler` directive, mod_cgi will take over and run it through an external program (usually Perl, Python, or Bash). The output of this program is then sent back to the client’s browser for display.
For example, let’s say you have a CGI script called `hello-world.cgi` in your web directory:
#!/bin/bash
# This is a bash script, indicated by the shebang at the top of the file
echo "Content-Type: text/plain" # Set the content type to plain text
# The above line is missing the newline character, which is necessary for proper formatting of the HTTP response header
echo # Print an empty line to separate the header from the body of the response
echo "Hello, world!" # Print a message to the client's browser
# The above line is missing the newline character, which is necessary for proper formatting of the HTTP response body
# Note: This script does not require the use of Perl, as indicated in the original script's context. It can be run directly as a bash script.
When you visit `http://example.com/cgi-bin/hello-world.cgi`, mod_cgi will execute this script and send back the output:
# This script is executed by mod_cgi when visiting the specified URL
# It will send back the output to the user
# The following line prints the string "Hello, world!" to the output
print("Hello, world!")
# The backticks (`) are not necessary and can be removed
# The following line ensures that the response includes a script using plaintext code block
# This is done by adding triple backticks () before and after the code block
# This allows the code to be displayed as-is without any formatting or interpretation
# This is useful for sharing code snippets or examples
print("plaintext")
# The following line closes the code block
print("")
Pretty simple, right? But what if we want to customize our CGI scripts even further? Well, that’s where `mod_cgid` comes in. This module is similar to mod_cgi, but instead of running each script as a separate process (which can be resource-intensive), it uses a shared pool of processes to handle multiple requests at once.
To enable this feature, simply add the following lines to your Apache configuration file:
# This script enables the use of the cgid module, which allows for more efficient handling of multiple requests at once.
# Load the cgid module
LoadModule cgid_module modules/mod_cgid.so
# Set the directory for CGI scripts
CGIDirector /cgi-bin
# Set the directory for the website's files
<Directory "/var/www/html">
# Disable any overrides
AllowOverride None
# Allow all users to access the files
Require all granted
</Directory>
# Set the handler for CGI scripts
<LocationMatch "^/(.*\.cgi)$" >
# Use the cgid-xscript handler
SetHandler cgid-xscript
# Allow for execution of CGI scripts
Options +ExecCGI
# Disable the use of MultiViews and enable the use of symbolic links
-MultiViews +SymLinksIfOwnerMatch
# Set the default index files
DirectoryIndex index.html index.htm
</LocationMatch>
This will load the `mod_cgid` module, set up a CGI directory at `/cgi-bin`, and enable CGI scripts with the extension `.cgi`. The `SetHandler cgid-xscript` directive tells Apache to use mod_cgid instead of mod_cgi for all requests that match the pattern `^/(.*\.cgi)$`.
With these simple steps, you can easily customize your CGI scripts and optimize their performance using Apache’s powerful modules.