Atlantic.Net Blog

How to Setup Nginx Cache on a LAMP Server

Apache is one of the most reliable and powerful web servers available. Apache is open-source, highly customizable, and comes with many modules that allow you to add additional functionality. It is known for its power and is specially designed for small-to-medium-sized websites.

Using Apache in parallel with Nginx and FastCGI Cache allows you to get the best of both worlds. This setup will improve your web server performance using the strengths of both web server applications. Nginx FastCGI cache works by storing copies of files in a cache so that they can be accessed more quickly.

In this tutorial, we will show you how to setup Nginx FastCGI cache with LAMP Server on Ubuntu 18.04. We will configure Apache as a backend server and Nginx as a frontend server with FastCGI Cache.

Step 1 – Install LAMP Server

First, install the Apache web server, PHP, PHP-FPM and other modules with the following command:

apt-get update -y
apt-get install apache2 php php-fpm libapache2-mod-php7.2 libapache2-mod-fcgid -y

Once all the packages are installed, you will need to enable some required Apache modules so that Apache can work with PHP-FPM.

You can enable them with the following command:

a2enmod actions fcgid alias proxy_fcgi

Next, restart the Apache service to apply the changes.

systemctl restart apache2

Step 2 – Create a Sample Website

First, create a directory for your website with the following command:

mkdir /var/www/html/example.com

Next, create a sample info.php file inside your website directory:

nano /var/www/html/example.com/info.php

Add the following lines:

<?php phpinfo(); ?>

Save and close the file, then change the ownership of your website to www-data user:

chown -R www-data:www-data /var/www/html/example.com
chmod -R 755 /var/www/html/example.com

Once you are finished, you can proceed to the next step.

Step 3 – Configure Apache Web Server

By default, the Apache web server listens on port 80. Here, we will use Apache as a backend server, so change the Apache default port from 80 to 8088.

nano /etc/apache2/ports.conf

Change the line from “Listen 80” to “Listen 8088”:

Listen 8088

Save and close the file when you are finished, then disable the Apache default virtual host file with the following command:

a2dissite 000-default.conf

Next, restart the Apache web server to implement the changes.

systemctl restart apache2

Next, create a new virtual host configuration file to serve your website:

nano /etc/apache2/sites-available/example.com.conf

Add the following content:

<VirtualHost 127.0.0.1:8088>
ServerName 127.0.0.1
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/example.com
DirectoryIndex info.php

<FilesMatch \.php$>
# 2.4.10+ can proxy to unix socket
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>

<Directory /var/www/html/>
Options FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
</VirtualHost>

Save and close the file when you are finished, then enable the Apache virtual host configuration file with the following command:

a2ensite example.com.conf

Next, restart the Apache service to apply the changes:

systemctl restart apache2

At this point, the Apache web server is configured and listening on localhost on port 8088.

Step 4 – Configure Nginx as a Reverse Proxy with FastCGI Cache

In this section, we will configure Nginx as a reverse proxy for Apache web server and enable FastCGI Cache.

First, install the Nginx web server with the following command:

apt-get install nginx -y

Once installed, create a new Nginx virtual host configuration file:

nano /etc/nginx/sites-available/example.com.conf

Add the following content:

# Enable FastCGI Support
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=nginxcache:100m max_size=1g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

server {
listen 80;
server_name example.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location = /favicon.ico { access_log off; log_not_found off; }
set $skip_cache 0;

#Disable caching for login session, user cookie, POST request, query string, site map and feeds
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}

# Enable caching for your website.
location / {
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $host;
proxy_buffering on;
proxy_cache nginxcache;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 
http_503 http_504;
proxy_cache_valid 200 301 302 60m;
proxy_cache_min_uses 1;
proxy_cache_lock on;

}
}

Save and close the file when you are finished, then enable the Nginx virtual host file with the following command:

ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Next, restart the Nginx service to apply the changes:

systemctl restart nginx

Step 5 – Test Nginx FastCGI Cache

At this point, Nginx is installed and configured as a reverse proxy for Apache with FastCGI Cache support. It’s time to verify whether the caching is working or not.

Open your web browser and access your Nginx web server using the URL http://example.com and reload the page for a few times.

Next, open your terminal and run the following command to fetch the http response header.

curl -I http://example.com

You should get the following output:

HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 24 Apr 2020 17:01:42 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Cache: HIT

From the above output, X-Cache: HIT indicates that the response was served from the cache.

Conclusion

In the above guide, we have installed and configured the Apache web server as a backend server and Nginx as a frontend server with FastCGI caching. Hopefully, this setup will dramatically improve the performance of your webserver. Get started with FastCGI caching on your LAMP server with VPS hosting from Atlantic.Net today!

Get a $250 Credit and Access to Our Free Tier!

Free Tier includes:
G3.2GB Cloud VPS a Free to Use for One Year
50 GB of Block Storage Free to Use for One Year
50 GB of Snapshots Free to Use for One Year