Enable Nginx FastCGI on Ubuntu 24.04

This article details the configuration of Nginx to run CGI scripts on Ubuntu 24.04, emphasizing the installation of FastCGI. By creating a /cgi-bin directory and configuring Nginx settings, users can facilitate dynamic web content. A Python script example demonstrates the successful execution of CGI, enhancing interactive web features effectively.

This article explains how Nginx can be configured to run CGI scripts on Ubuntu 24.04.

A CGI (Common Gateway Interface) script is a standard protocol that allows web servers to interact with executable programs, often written in languages like Perl, Python, or PHP, to generate dynamic web content.

CGI enables generating dynamic web content that responds to user input or other factors.

Enabling CGI on a Nginx server supports dynamic interactions and allows for functionalities like search features, login systems, and other interactive elements on websites.

Install FastCGI

To use and run CGI script on Nginx, you must first install and configure FastCGI. With Nginx installed, run the command below to install FastCGI.

sudo apt install fcgiwrap

After installing the FastCGI package, we’ll define a location to store our CGI scripts. We’ll create a new /cgi-bin folder in the Nginx root directory for this post.

The URL to the CGI scripts directory will be [/var/www/cgi-bin/].

First, create the CGI directory by running the command below. Then, adjust the directory permissions as needed.

sudo mkdir /var/www/cgi-bin
sudo chmod 755 /var/www/cgi-bin

Next, run the command below to create an Nginx configuration file and define our CGI script location and other settings.

sudo nano /etc/nginx/fcgiwrap.conf

Then, copy the block below, paste it into the file, and save.

location /cgi-bin/ {
gzip off;
root /var/www;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

After creating the FastCGI config above, include it in your Nginx server block. We’ll use the default server block for this post, but you can create new ones.

Open Nginx default server block.

sudo nano /etc/nginx/sites-available/default

Then, include the configuration file created above in the server {} section.

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.html index.htm index.nginx-debian.html;

server_name example.com;

include fcgiwrap.conf;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
............
............

Save and exit the file.

Next, enable FastCGI and reload Nginx services by running the command below.

sudo  systemctl enable fcgiwrap
sudo systemctl reload nginx

Test Apache CGI execution

You should be ready to get your CGI settings in Apache.

Run the command below to create a blank CGI index file.

sudo nano /var/www/cgi-bin/index.cgi

Copy the script below, paste it into the file, and save.

#!/usr/bin/python3

print("Content-type: text/html\n")
print("<html>\n<body>")
print("<p style=\"width: 100%; font-size: 60px; font-weight: bold; text-align: center;\">")
print("CGI is Enabled!!!")
print("</p>")
print("</body>\n</html>")

Make the file executable by running the command below.

sudo chmod 705 /var/www/cgi-bin/index.cgi

Now, open your browser and browse the script.

http://example.com/cgi-bin/index.cgi

That should do it!

Conclusion:

  • Configuring Nginx to run CGI scripts on Ubuntu 24.04 enhances the server’s capability to deliver dynamic web content.
  • FastCGI plays a crucial role in handling CGI requests efficiently and effectively.
  • Setting up the /cgi-bin directory allows for organized management of your CGI scripts.
  • Testing the configuration through a simple Python script ensures the setup works correctly.
  • Overall, this configuration opens up possibilities for interactive web features, improving user experience on your website.
Richard Avatar

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *