Back to all questions

How to Implement a Reverse Proxy?

Alex Khazanovich
Reverse Proxy
July 12, 2024

Setting up a reverse proxy server, like Nginx involves installing Nginx, configuring it to forward requests, and securing it with SSL. 

Regular maintenance and updates are also crucial for optimal performance and security.

How Reverse Proxy Works

A reverse proxy works by intercepting client requests and then forwarding them to one or more backend servers. It receives the responses from the backend servers and sends them back to the clients. 

This process, including components like GSLB and proxy caching, is transparent to the client.

Setting Up a Reverse Proxy with Nginx

Prerequisites

  • A Linux server (e.g., Ubuntu)
  • Root or sudo access to the server
  • Basic knowledge of the command line

Step 1: Install Nginx

1. Update your package list:

sudo apt update

2. Install Nginx:

sudo apt install nginx

3. Start Nginx and enable it to start on boot:

sudo systemctl start nginx
sudo systemctl enable nginx

Step 2: Configure Nginx as a Reverse Proxy

1. Open the Nginx configuration file:

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

2. Modify the configuration to set up a reverse proxy:

server {
    listen 80;

    server_name your_domain.com;

    location / {
        proxy_pass http://your_backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Replace your_domain.com with your domain name and http://your_backend_server with the IP address or domain of your backend server.

3. Test the Nginx configuration:

sudo nginx -t

4. Reload Nginx to apply the changes:

sudo systemctl reload nginx

Step 3: Secure the Reverse Proxy

1. Install Certbot to obtain SSL certificates:

sudo apt install certbot python3-certbot-nginx

2. Obtain an SSL certificate:

sudo certbot --nginx -d your_domain.com

Follow the prompts to complete the SSL certificate installation.

3. Configure Nginx to use SSL:

Certbot automatically modifies your Nginx configuration to use SSL. Ensure your configuration looks like this:

server {
    listen 80;
    server_name your_domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://your_backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

4. Ensure firewall rules allow traffic on ports 80 and 443:

sudo ufw allow 'Nginx Full'

Step 4: Additional Security Considerations

  1. DDoS Protection: Use tools like fail2ban to mitigate DDoS attacks.
  2. Regular Updates: Keep Nginx and your server updated to protect against vulnerabilities.
  3. Access Controls: Implement IP whitelisting or other access control mechanisms if needed.

Monitoring and Maintenance

  • Logs: Regularly check Nginx logs located at /var/log/nginx/ for any unusual activity.
  • Performance Monitoring: Use tools like Grafana and Prometheus to monitor the performance of your reverse proxy.

Setting Up a Reverse Proxy with Apache HTTP Server

Prerequisites

  • A Linux server (e.g., Ubuntu)
  • Root or sudo access to the server
  • Basic knowledge of the command line

Step 1: Install Apache HTTP Server

1. Update your package list:

sudo apt update

2. Install Apache:

sudo apt install apache2

3. Start Apache and enable it to start on boot:

sudo systemctl start apache2
sudo systemctl enable apache2

Step 2: Enable Required Apache Modules

To use Apache as a reverse proxy, you need to enable the following modules: proxy, proxy_http, headers, and ssl.

1. Enable the modules:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers
sudo a2enmod ssl

2. Restart Apache to apply the changes:

sudo systemctl restart apache2

Step 3: Configure Apache as a Reverse Proxy

1. Open the default Apache configuration file:

sudo nano /etc/apache2/sites-available/000-default.conf

2. Modify the configuration to set up a reverse proxy:

<VirtualHost *:80>
    ServerName your_domain.com

    ProxyPreserveHost On
    ProxyPass / http://your_backend_server/
    ProxyPassReverse / http://your_backend_server/

    <Proxy *>
        Require all granted
    </Proxy>

    # Optional: to pass original IP address to the backend server
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 127.0.0.1

</VirtualHost>

Replace your_domain.com with your domain name and http://your_backend_server with the IP address or domain of your backend server.

3. Test the Apache configuration:

sudo apachectl configtest

4. Reload Apache to apply the changes:

sudo systemctl reload apache2

Step 4: Secure the Reverse Proxy with SSL

1. Install Certbot to obtain SSL certificates:

sudo apt install certbot python3-certbot-apache

2. Obtain an SSL certificate:

sudo certbot --apache -d your_domain.com

Follow the prompts to complete the SSL certificate installation.

3. Configure Apache to use SSL:

Certbot automatically modifies your Apache configuration to use SSL. Ensure your configuration looks like this:

<VirtualHost *:80>
    ServerName your_domain.com
    Redirect permanent / https://your_domain.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName your_domain.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/your_domain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/your_domain.com/privkey.pem

    ProxyPreserveHost On
    ProxyPass / http://your_backend_server/
    ProxyPassReverse / http://your_backend_server/

    <Proxy *>
        Require all granted
    </Proxy>

    # Optional: to pass original IP address to the backend server
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 127.0.0.1

</VirtualHost>

4. Ensure firewall rules allow traffic on ports 80 and 443:

sudo ufw allow 'Apache Full'

Step 5: Additional Security Considerations

  1. DDoS Protection: Use tools like fail2ban to mitigate DDoS attacks.
  2. Regular Updates: Keep Apache and your server updated to protect against vulnerabilities.
  3. Access Controls: Implement IP whitelisting or other access control mechanisms if needed.

Monitoring and Maintenance

  • Logs: Regularly check Apache logs located at /var/log/apache2/ for any unusual activity.
  • Performance Monitoring: Use tools like Grafana and Prometheus to monitor the performance of your HTTP reverse proxy.