> ## Content Index
> Fetch the complete content index at: https://tim.sodhis.org/llms.txt
> Use this file to discover other available public pages before exploring further.

# Homelab - adding an nginx reverse proxy to the mix
- URL: https://tim.sodhis.org/homelab-adding-an-nginx-reverse-proxy-to-the-mix/
- Published: 2018-06-28T21:13:50.000Z
- Updated: 2026-01-13T01:12:45.000Z
- Author: Tim Sodhi
- Tags: Uncategorized, #wordpress, #Import 2026-01-11 22:49

Of nginx tutorials there are many on the web. With my growing Homelab, having added Confluence to the mix, and having nearly eleven virtual machines on my Home Servers, I was simply tired of accessing them all with the port number qualifier.

Moving the DNS provider to Cloudflare (Free) was the first step, but I was interested in setting up an nginx reverse proxy to handle the plethora of VM’s that I now have. SO, here’s how I went about it.

I created a separate VM for the nginx proxy, lean on specs, as it really doesn’t need much. I used

- 20GB HDD space
- 2GB RAM
- 1 CPU

## Install Ubuntu & nginx

Install Ubuntu, as always. The requirements from an nginx system are quite lean.

Install nginx from the PPA (as the version in the repository is 1.10)

sudo apt-add-repository ppa:nginx/development
sudo apt update && sudo apt upgrade
sudo apt install nginx

Forward all 443 and 80 ports from the router, along with other TCP/UDP ports dealing with HTTP traffic to the new nginx server.

Create the first vhost file.

cd /etc/nginx/sites-available/
sudo vi sodhisnet.conf

#### Before enabling SSL

server {
    listen 80;
    listen [::]:80;
 
    server_name sodhis.net www.sodhis.net;
    set $upstream <internal ip address of web server>;
 
    location / {
        proxy_pass_header Authorization;
        proxy_pass http://$upstream;
        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-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        client_max_body_size 0;
        proxy_ssl_server_name on;
        proxy_read_timeout 36000s;
        proxy_redirect off;
    }
}

Activate the new vhost in nginix

sudo ln -s /etc/nginx/sites-available/sodhisnet.conf /etc/nginx/sites-enabled/sodhisnet.conf
sudo service nginx restart

Do this for every vhost created.

#### Enabling SSL

##### LetsEncrypt

sudo certbot -d sodhis.net -d *.sodhis.net --manual --preferred-challenges "dns"--server https://acme-v02.api.letsencrypt.org/directory certonly

##### Changes to the vhost

server {
    listen 80;
    listen [::]:80;
 
    server_name sodhis.net www.sodhis.net;
    return 301 https://$server_name$request_uri;
}
 
server {
    # The IP that you forwarded in your router (nginx proxy)
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
 
    ssl_certificate /etc/letsencrypt/live/sodhis.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sodhis.net/privkey.pem;
 
    # Make site accessible from http://localhost/
    server_name sodhis.net www.sodhis.net;
 
    # The internal IP of the VM that hosts your Apache config
    set $upstream <internal IP of the webhost>;
 
    location / {
        proxy_pass_header Authorization;
        proxy_pass http://$upstream;
        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-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        client_max_body_size 0;
        proxy_ssl_server_name on;
        proxy_read_timeout 36000s;
        proxy_redirect off;
    }
}

sudo service nginx restart

IF one has a WordPress blog on the web host, add the following to wp-config.php

/**
 * Handle SSL reverse proxy
 */
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS']='on';
 
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}