aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2022-04-02-nginx-reverse-proxy.md
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-07-28 19:46:20 -0500
committerChristian Cleberg <hello@cleberg.net>2024-07-28 19:46:20 -0500
commit2be43cc479dfd4cfb621f14381330c708291e324 (patch)
tree7ac50f99425c5524c0820360754045b80d1bafcc /content/blog/2022-04-02-nginx-reverse-proxy.md
parentafe76ac7d7498b862abaa623790b91410e34574d (diff)
downloadcleberg.net-2be43cc479dfd4cfb621f14381330c708291e324.tar.gz
cleberg.net-2be43cc479dfd4cfb621f14381330c708291e324.tar.bz2
cleberg.net-2be43cc479dfd4cfb621f14381330c708291e324.zip
conversion from Zola to Weblorg
Diffstat (limited to 'content/blog/2022-04-02-nginx-reverse-proxy.md')
-rw-r--r--content/blog/2022-04-02-nginx-reverse-proxy.md226
1 files changed, 0 insertions, 226 deletions
diff --git a/content/blog/2022-04-02-nginx-reverse-proxy.md b/content/blog/2022-04-02-nginx-reverse-proxy.md
deleted file mode 100644
index 1066d99..0000000
--- a/content/blog/2022-04-02-nginx-reverse-proxy.md
+++ /dev/null
@@ -1,226 +0,0 @@
-+++
-date = 2022-04-02
-title = "Set-Up a Reverse Proxy with Nginx"
-description = ""
-draft = false
-+++
-
-# What is a Reverse Proxy?
-
-A reverse proxy is a server that is placed between local servers or services and
-clients/users (e.g., the internet). The reverse proxy intercepts all requests
-from clients at the network edge and uses its configuration files to determine
-where each request should be sent.
-
-## A Brief Example
-
-For example, let's say that I run three servers in my home:
-
-- Server01 (`example.com`)
-- Server02 (`service01.example.com`)
-- Server03 (`service02.example.com`)
-
-I also run a reverse proxy in my home that intercepts all public traffic:
-
-- Reverse Proxy
-
-Assume that I have a domain name (`example.com`) that allows clients to request
-websites or services from my home servers.
-
-In this case, the reverse proxy will intercept all traffic from `example.com`
-that enters my network and determine if the client is requesting valid data,
-based on my configuration.
-
-If the user is requesting `example.com` and my configuration files say that
-Server~01~ holds that data, Nginx will send the user to Server~01~. If I were to
-change the configuration so that `example.com` is routed to Server~02~, that
-same user would be sent to Server~02~ instead.
-
-```txt
-┌──────┐ ┌───────────┐
-│ User │─┐ ┌──► Server_01 │
-└──────┘ │ │ └───────────┘
- │ ┌──────────┐ ┌───────────────┐ │ ┌───────────┐
- ├────► Internet ├───► Reverse Proxy ├─────├──► Server_02 │
- │ └──────────┘ └───────────────┘ │ └───────────┘
-┌──────┐ │ │ ┌───────────┐
-│ User │─┘ └──► Server_03 │
-└──────┘ └───────────┘
-```
-
-# Reverse Proxy Options
-
-There are a lot of options when it comes to reverse proxy servers, so I'm just
-going to list a few of the options I've heard recommended over the last few
-years:
-
-- [Nginx](https://nginx.com)
-- [Caddy](https://caddyserver.com)
-- [Traefik](https://traefik.io/)
-- [HAProxy](https://www.haproxy.org/)
-- [Squid](https://ubuntu.com/server/docs/proxy-servers-squid)
-
-In this post, we will be using Nginx as our reverse proxy, running on Ubuntu
-Server 20.04.4 LTS.
-
-# Nginx Reverse Proxy Example
-
-## Local Applications
-
-You may be like me and have a lot of applications running on your local network
-that you'd like to expose publicly with a domain.
-
-In my case, I have services running in multiple Docker containers within a
-single server and want a way to visit those services from anywhere with a URL.
-For example, on my local network, [Dashy](https://dashy.to) runs through port
-4000 (`localhost:4000`) and [Uptime
-Kuma](https://github.com/louislam/uptime-kuma) runs through port 3001
-(`localhost:3001`).
-
-In order to expose these services to the public, I will need to do the
-following:
-
-1. Set up DNS records for a domain or subdomain (one per service) to point
- toward the IP address of the server.
-2. Open up the server network's HTTP and HTTPS ports (80 & 443) so that the
- reverse proxy can accept traffic and determine where to send it.
-3. Install the reverse proxy software.
-4. Configure the reverse proxy to recognize which service should get traffic
- from any of the domains or subdomains.
-
-## Step 1: DNS Configuration
-
-To start, update your DNS configuration so that you have an `A` record for each
-domain or subdomain.
-
-The `A` records should point toward the public IP address of the server. If you
-don't know the public IP address, log in to the server and run the following
-command:
-
-```sh
-curl ifconfig.co
-```
-
-In the DNS example below, `xxx.xxx.xxx.xxx` is the public IP address of the
-server.
-
-```conf
-example.com A xxx.xxx.xxx.xxx
-uptime.example.com A xxx.xxx.xxx.xxx
-dashy.example.com A xxx.xxx.xxx.xxx
-www CNAME example.com
-```
-
-Finally, ensure the DNS has propagated correctly with [DNS
-Checker](https://dnschecker.org) by entering your domains or subdomains in the
-search box and ensuring the results are showing the correct IP address.
-
-## Step 2: Open Network Ports
-
-This step will be different depending on which router you have in your home. If
-you're not sure, try to visit [192.168.1.1](http://192.168.1.1) in your browser.
-Login credentials are usually written on a sticker somewhere on your
-modem/router.
-
-Once you're able to log in to your router, find the Port Forwarding settings.
-You will need to forward ports `80` and `443` to whichever machine is running
-the reverse proxy.
-
-In my case, the table below shows the port-forwarding rules I've created. In
-this table, `xxx.xxx.xxx.xxx` is the local device IP of the reverse proxy
-server, it will probably be an IP between `192.168.1.1` and `192.168.1.255`.
-
-| NAME | FROM PORT | DEST PORT/IP | ENABLED |
-| ----- | --------- | --------------- | ------- |
-| HTTP | 80 | xxx.xxx.xxx.xxx | TRUE |
-| HTTPS | 443 | xxx.xxx.xxx.xxx | TRUE |
-
-Once configured, these rules will direct all web traffic to your reverse proxy.
-
-## Step 3: Nginx Installation
-
-To install Nginx, simply run the following command:
-
-```sh
-sudo apt install nginx
-```
-
-If you have a firewall enabled, open up ports `80` and `443` on your server so
-that Nginx can accept web traffic from the router.
-
-For example, if you want to use `ufw` for web traffic and SSH, run the following
-commands:
-
-```sh
-sudo ufw allow 'Nginx Full'
-sudo ufw allow SSH
-sudo ufw enable
-```
-
-## Step 4: Nginx Configuration
-
-Now that we have domains pointing toward the server, the only step left is to
-configure the reverse proxy to direct traffic from domains to local services.
-
-To start, you'll need to create a configuration file for each domain in
-`/etc/nginx/sites-available/`. They will look identical except for the
-`server_name` variable and the `proxy_pass` port.
-
-Dashy:
-
-```sh
-nano /etc/nginx/sites-available/dashy.example.com
-```
-
-```config
-server {
- listen 80;
- server_name dashy.example.com;
-
- location / {
- proxy_pass http://localhost:4000;
- }
-}
-```
-
-Uptime:
-
-```sh
-nano /etc/nginx/sites-available/uptime.example.com
-```
-
-```config
-server {
- listen 80;
- server_name uptime.example.com;
-
- location / {
- proxy_pass http://localhost:3001;
- }
-}
-```
-
-Once the configuration files are created, you will need to enable them with the
-`symlink` command:
-
-```sh
-sudo ln -s /etc/nginx/sites-available/dashy.example.com /etc/nginx/sites-enabled/
-```
-
-Voilà! Your local services should now be available through their URLs.
-
-# HTTPS with Certbot
-
-If you've followed along, you'll notice that your services are only available
-via HTTP (not HTTPS).
-
-If you want to enable HTTPS for your new domains, you will need to generate
-SSL/TLS certificates for them. The easiest way to generate certificates on Nginx
-is [Certbot](https://certbot.eff.org):
-
-```sh
-sudo apt install snapd; sudo snap install core; sudo snap refresh core
-sudo snap install --classic certbot
-sudo ln -s /snap/bin/certbot /usr/bin/certbot
-sudo certbot --nginx
-```