A reverse proxy is an intermediate server that sits between clients and web servers. It serves as a front-end and is responsible for handling all client requests and forwarding them to the backend server. For better privacy and security, you may need to implement a reverse proxy in front of a web server.

Apache and Nginx both are very popular open-source web servers used by thousands of users worldwide. Nginx hosts static websites, proxy servers, and caching servers. While Apache is used to host dynamic websites, you can also configure Nginx as a reverse proxy for Apache webserver to get advantages of both web servers.

In this post, we will show you how to configure Nginx as a reverse proxy for the Apache web servers on Arch Linux.

Step 1 – Configure Repository

By default, the default repository is outdated in Arch Linux, so you will need to modify the default mirror list. You can do it by editing the mirror list configuration file:

nano  /etc/pacman.d/mirrorlist

Remove all lines and add the following lines:

## Score: 0.7, United States
Server = http://mirror.us.leaseweb.net/archlinux/$repo/os/$arch
## Score: 0.8, United States
Server = http://lug.mtu.edu/archlinux/$repo/os/$arch
Server = http://mirror.nl.leaseweb.net/archlinux/$repo/os/$arch
## Score: 0.9, United Kingdom
Server = http://mirror.bytemark.co.uk/archlinux/$repo/os/$arch
## Score: 1.5, United Kingdom
Server = http://mirrors.manchester.m247.com/arch-linux/$repo/os/$arch
Server = http://archlinux.dcc.fc.up.pt/$repo/os/$arch
## Score: 6.6, United States
Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch
## Score: 6.7, United States
Server = http://mirrors.acm.wpi.edu/archlinux/$repo/os/$arch
## Score: 6.8, United States
Server = http://ftp.osuosl.org/pub/archlinux/$repo/os/$arch
## Score: 7.1, India
Server = http://mirror.cse.iitk.ac.in/archlinux/$repo/os/$arch
## Score: 10.1, United States
Server = http://mirrors.xmission.com/archlinux/$repo/os/$arch

Save and close the file, then update all the package indexes with the following command:

pacman -Syu

Step 2 – Install Apache Web Server

First, open your terminal and install the Apache package with the following command.

pacman -S apache

After successful installation, start and enable the Apache service with the following command.

systemctl start httpd
systemctl enable httpd

You can also verify the Apache status using the following command.

systemctl status httpd

Output.

● httpd.service - Apache Web Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: active (running) since Sun 2023-03-26 05:46:34 UTC; 3min 7s ago
   Main PID: 14223 (httpd)
      Tasks: 9 (limit: 4685)
     Memory: 45.5M
        CPU: 207ms
     CGroup: /system.slice/httpd.service
             ├─14223 /usr/bin/httpd -k start -DFOREGROUND
             ├─14224 /usr/bin/httpd -k start -DFOREGROUND
             ├─14225 /usr/bin/httpd -k start -DFOREGROUND
             ├─14226 /usr/bin/httpd -k start -DFOREGROUND
             ├─14227 /usr/bin/httpd -k start -DFOREGROUND
             ├─14228 /usr/bin/httpd -k start -DFOREGROUND
             ├─14231 /usr/bin/httpd -k start -DFOREGROUND
             ├─14232 /usr/bin/httpd -k start -DFOREGROUND
             └─14233 /usr/bin/httpd -k start -DFOREGROUND

Mar 26 05:46:34 archlinux systemd[1]: Started Apache Web Server.

Step 3 – Configure Apache as a Backend Server

By default, Apache listens on port 80. To configure Apache as a backend server, you will need to change the Apache default port. You can change it by editing the Apache main configuration file.

nano /etc/httpd/conf/httpd.conf

Change the following line.

Listen 8000

Save and close the file, then restart the Apache service to implement the changes.

systemctl restart httpd

You can now check the Apache listening port using the following command.

ss -antpl | grep httpd

You should see the new Apache port in the following output.

LISTEN 0      511                *:8000             *:*    users:(("httpd",pid=14233,fd=4),("httpd",pid=14232,fd=4),("httpd",pid=14231,fd=4),("httpd",pid=14228,fd=4),("httpd",pid=14227,fd=4),("httpd",pid=14226,fd=4),("httpd",pid=14225,fd=4),("httpd",pid=14224,fd=4),("httpd",pid=14223,fd=4))

Step 4 – Create a Simple Page for Apache

Next, you will need to create a simple HTML page to test the Apache server. You can create it with the following command.

nano /srv/http/index.html

Add the following code:

<html>
 <title>Welcome</title>
  <body>
   <h2>Welcome to Apache Web Server</h2>
  </body>
</html>

Save and close the file when you are done.

Step 5 – Install and Configure Nginx as a Reverse Proxy

First, install the Nginx package using the following command.

pacman -S nginx-mainline

After installing Nginx, start and enable the Nginx service using the following command.

systemctl start nginx
systemctl enable nginx

Next, create a directory to store Nginx virtual host.

mkdir /etc/nginx/sites-enabled

Next, create an Nginx configuration file to forward traffic to the Apache backend server.

nano /etc/nginx/sites-enabled/apache.conf

Add the following configuration.

upstream apache_backend {
  server localhost:8000;
}

server {
    listen 80;
    server_name apache.example.com;

    location / {
        proxy_pass http://apache_backend/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}

Save and close the file, then edit the Nginx configuration file.

nano /etc/nginx/nginx.conf

Add the following lines after http{:

server_names_hash_bucket_size 64;
include sites-enabled/*;

Save the file when you are done. Then, verify the Nginx configuration.

nginx -t

You will see the following output.

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

Next, restart the Nginx service to implement the changes.

systemctl restart nginx

Step 6 – Verify Nginx Proxy

At this point, Nginx is installed and configured to forward traffic to the Apache backend server. You can test it using the URL http://apache.example.com in your web browser. You should see the Apache backend page on the following screen.
Verify Nginx

Conclusion

In this tutorial, you learned how to configure Nginx as a reverse proxy for the Apache web server. You can use this guide to implement this setup in the production environment. Try this setup on dedicated server hosting from Atlantic.Net!