NGINX is a light-weight web server first released in 2004 which can also be used as a reverse proxy. We have made many tutorials over NGINX at LowEndBox, and recently setup a Node.js Application, it also used NGINX as its reverse proxy, but it used an NPM package to generate the app-specific configurations.
In this tutorial, we’ll configure NGINX to Reverse Proxy from an Apache backend hosted on a local port just for an example. In general, Reverse Proxy is helpful if you have a hard-coded application (like Plex, Webmin, etc) which listens on a non-default default port (i.e. not on port 80 / 443), or you are already using the HTTP ports with NGINX web server and cannot assign those ports to another application.
Sometimes, these kinds of configurations are also done where the web application is only compatible with a specific webserver like Apache due to custom rewrites support, and NGINX is used in front-end for its low memory footprint and ability to cache static content. This kind of setup is seen in VestaCP’s default installation too.
Requirements:
- We will use Ubuntu 18.04 for this tutorial, but it can also be done similarly in Debian or CentOS.
- A domain name or subdomain’s A record pointing to the IP of the VPS.
- We will use nano text editor, you can also use vim or choose to edit the configurations via SFTP on a local editor like Notepad++.
Step 1: Install Apache as a Backend
Again, we are installing Apache only as an example, your backend can be any application as per the requirement.
Let’s install apache2 with apt
apt install apache2 -y
After installing, the apache webserver should now listen on port 80, we can verify it by going to our server IP or the domain we pointed to our server’s IP.
https://cdn.diamondzxd.com/index.php/s/8qeebdjmq4m88kr/preview
Changing Apache’s Ports
Since the HTTP ports will be taken over by NGINX server in the future, we’ll change apache’s ports, we can change apache’s ports by editing the Apache’s ports.conf file :
nano /etc/apache2/ports.conf
We’ll change the default HTTP port to 8080 and 8443
Listen 8080
<IfModule ssl_module>
Listen 8443
</IfModule>
<IfModule mod_gnutls.c>
Listen 8443
</IfModule>
Now, let’s restart the apache web-server to see changes.
service apache2 restart
As you can see, apache now listens on port 8080
https://cdn.diamondzxd.com/index.php/s/swk87TWYb56dfFT/preview
Step 2: Installing NGINX webserver
apt install nginx -y
When you install NGINX and go to your Server’s IP, you will see default Apache’s page again. But don’t worry, that’s due to the fact that both webservers are sharing the /var/www/html directory as we can verify from the NGINX’s config file /etc/nginx/sites-enabled/default :
root /var/www/html;
https://cdn.diamondzxd.com/index.php/s/JdpSryAACbGd2M8/preview
Instead of displaying index.nginx-debian.html, it is displaying index.html because it is first in the config’s directory index.
Step 3: Adding Additional Headers to Apache
Although this is not necessary and not required to achieve what we’re doing, but just for a demonstration, we will add an Additional “Serverd-By : Backend” header to see that the content is actually being served by our Backend, and even after reverse proxies the original header will show.
To do that, simply add the following lines to the apache2.conf
nano /etc/apache2/apache2.conf
<IfModule mod_headers.c>
<Directory />
Header always set Served-By “Backend”
</Directory>
</IfModule>
Activate the apache’s headers mod and restart apache webserver.
a2enmod headers
service apache2 restart
Let’s go to SERVER_IP:8080 and verify those headers.
https://cdn.diamondzxd.com/index.php/s/YBcBLBKHJ2EjBtD/preview
As you can see, the Served-By : Backend header is present.
Step 4 : Configuring Reverse Proxy
Now that the backend is setup, it’s time to finally configure reverse proxy.
First, we’ll remove the default configuration file.
unlink /etc/nginx/sites-enabled/default
Then, add our new config to the /etc/nginx/sites-enabled directory
nano /etc/nginx/sites-enabled/reverse_proxy
server {
listen 80;
server_name DOMAIN_NAME;
location / {
proxy_pass http://YOUR_SERVER_IP:8080;
}
}
Replace the DOMAIN_NAME with the actual FQDN you wish to use and YOUR_SERVER_IP with the server IP:PORT or location to your backend.
Then, finally restart NGINX webserver.
service nginx restart
Verifying the Proxy
Let’s go to our intended domain name, we’ll find the index.html file being served which was in /var/www/html directory: https://cdn.diamondzxd.com/index.php/s/T4WG6RNsgq9E7DB/preview
Okay, we see the index.html, but is it really being served by Our Backend? To verify that, lets inspect the headers: https://cdn.diamondzxd.com/index.php/s/pmBCxZWe8sFDeyQ/preview
Indeed, the Served-By : Backend header we set in Apache, is now being displayed through NGINX, which can confirm that the Reverse Proxy is working!
You can also try to stop Apache (Backend), and see what follows
service apache2 stop
https://cdn.diamondzxd.com/index.php/s/RRJBf75atX8NgFf/preview
As expected, since the backend is now down, we get a 502 Bad Gateway error, which further verifies that the content is serving through Reverse Proxy J
Let’s restart the backend,
service apache2 start
https://cdn.diamondzxd.com/index.php/s/BN7w3nFfEtBgbjw/preview
And the site comes back up!
Conclusion
We have shown your how to configure Reverse Proxy with NGINX over Apache (or any Backend) on a Ubuntu 18.04 VPS. You can do this parallel with your Other NGINX websites on your VPS.
We hope you like this tutorial!
Related Posts:
- Have you ever visited the web’s busiest hosting forum? LowEndTalk awaits. - September 27, 2022
- Grab the deals first by subscribing to our new deal alerts - September 16, 2022
- LowEndBox is on Instagram and TikTok! - August 5, 2022
Leave a Reply