Setting Up Nginx with FastCGI-Cache Module on Ubuntu 20.04 LTS (Focal Fossa)

Screenshot From 2020 05 22 18 06 23

The latest stable release and long-term support of Ubuntu 20.04 LTS (Focal Fossa) has officially been rolled out since late last month. It bring many new features, bug fix, and improvements over its predeccessor. The most importants is Ubuntu 20.04 LTS includes the Linux kernel version 5.4+.

In today’s guide, we will teach you on how to install and configure Nginx with FastCGI-Cache module on Ubuntu 20.04 LTS (Focal Fossa). It’s very easy to do, you just need virtual machine running on Ubuntu 20.04 LTS. I think the guide is not very much different with previous version of Ubuntu LTS server.

1.) Full Root Privileges

Make sure you have full root access on your cloud server.

2.) Add Launchpad PPA Repository

After you have logged in to your system as a root user, we must add Launchpad PPA repository (Personal Package Archieve) for NGINX Mainline. It’s officially maintenanced by Nginx team.

$ sudo add-apt-repository ppa:nginx/mainline

And then simply press ENTER.

3.) Run System Update and Let’s Install Nginx

$ sudo apt update
$ sudo apt install nginx-extras

4.) Start Nginx and Enable it from Boot Automatically

$ systemctl enable nginx.service
$ systemctl start nginx

Check your Nginx version

root@dev:~# nginx -V
nginx version: nginx/1.17.10 (Ubuntu)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled

5.) Install and Configure PHP 7.4 FPM (PHP FastCGI Process Manager)

Since Ubuntu 20.04 LTS is shipped with PHP 7.4 as its default PHP version, so we don’t need to use third-party repository on this guide. Simply run the following command to buid PHP 7.4 FPM on your Ubuntu machine.

$ apt install php7.4 php-apcu php7.4-common php7.4-mysql php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-cgi php7.4-json php7.4-cli php7.4-fpm php-pear php7.4-dev php7.4-imap php7.4-mbstring php7.4-xml php7.4-tidy php7.4-sqlite3 php7.4-xsl php7.4-gmp php7.4-zip php7.4-soap

6.) Start PHP7.4-FPM and Enable it to Start from Boot Automatically

Sometimes after we reboot the server, some services like PHP-FPM don’t start automatically. For this reason we need to make sure that PHP-FPM can start automatically from boot.

$ systemctl enable php7.4-fpm.service
$ systemctl start php7.4-fpm

7.) Configure FastCGI-Cache to work with Nginx

Simply add the following snippet code under “http {” inside your Nginx main config file.

$ nano /etc/nginx/nginx.conf
	# Fastcgi-Cache Configuration
        fastcgi_cache_path /var/nginx/fastcgi-cache levels=1:2 keys_zone=fcgicache:256m inactive=60m;
        fastcgi_cache_key "$scheme$request_method$host$request_uri";
        fastcgi_cache_use_stale error timeout invalid_header http_500;

        # Add Response Header Status

        add_header X-Cache $upstream_cache_status;
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

After that, don’t forget create fastcgi-cache directory

$ mkdir -p /var/nginx/fastcgi-cache

Test your Nginx configuration

$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Restart Nginx web server

$ systemctl restart nginx

8.) Setting Up Nginx ServerBlock for Your Domain

Next, we must create serverblock a.k.a vhosts inside Nginx sites-available directory. Make sure to replace with your actual domain name.

However, don’t forget to create docs root or public folder to manage all of your web files.

$ mkdir -p /var/www/ /var/www/
$ chown -R www-data:www-data /var/www/

Copy this simple snippet code into your serverblock.

$ nano /etc/nginx/sites-available/
# ServerBlock Configuration for
server {
        listen   80; ## listen for IPv4 Address
        #listen   [::]:80 default ipv6only=on;

        root /var/www/;
        index index.php index.htm index.html;
        access_log   /var/log/nginx/;
        error_log    /var/log/nginx/;

        location / {
                try_files $uri $uri/ /index.php?$args;

	# Nginx Fastcgi Config
        #fastcgi_cache start
        set $no_cache 0;

        # POST requests and urls with a query string should handled by PHP
        if ($request_method = POST) {
        set $no_cache 1;
        if ($query_string != "") {
        set $no_cache 1;

        # Don't cache uris containing the following segments
        if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
        set $no_cache 1;

        # Don't use the cache for logged in users or recent commenters
        if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $no_cache 1;

        # Fastcgi-Cache Config
	location ~ \.php$ {
		try_files $uri =404;
		include fastcgi_params;
                include fastcgi.conf;
                fastcgi_param HTTP_PROXY "";
                fastcgi_index index.php;
                # fastcgi_intercept_errors on;
	        fastcgi_cache_bypass $no_cache;
	        fastcgi_no_cache $no_cache;
	        fastcgi_cache fcgicache;
	        fastcgi_cache_valid 200 60m;

        # Fastcgi-Purge Config
        location ~ /purge(/.*) {
               # Uncomment the following two lines to allow purge only from the webserver
	       #deny all;
               fastcgi_cache_purge fcgicache "$scheme$request_method$host$1";

	location = /robots.txt { access_log off; log_not_found off; }
	location ~ /\. { deny  all; access_log off; log_not_found off; }


Let’s create symbolic link (symlink) to Nginx sites enabled directory.

$ ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
$ ln -s /var/log/nginx/ /var/www/
$ ln -s /var/log/nginx/ /var/www/

Test again your Nginx configuration, and restart it

$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ systemctl restart nginx

9.) Change Unix Socket Connection to TCP Socket

Next, we must edit default pool directives for PHP7.4-FPM in order to make Nginx work properly with PHP-FPM.

$ nano /etc/php/7.4/fpm/pool.d/www.conf

Search for the line:

listen = /run/php/php7.4-fpm.sock

Then replace with this one:

listen =

Then restart PHP7.4-FPM service

$ systemctl restart php7.4-fpm

Now you have Nginx which works with the FastCGI-Cache module and PHP 7.4 FPM inside your virtual machine or cloud server. Next you can install web aplication software like WordPress, Joomla or Drupal. However, be sure to install and configure the database server first.