Skip to content

🔄 Reverse Proxy

What Is a Reverse Proxy?

Imagine you're at a restaurant ordering food. You tell the waiter (Nginx) "I'd like the braised pork," the waiter goes to the kitchen (backend server) to get it, and serves it to you. You don't need to know where the kitchen is or how many chefs there are — the waiter handles everything.

A reverse proxy means: the client only knows about Nginx, not where the actual backend is.

Basic Reverse Proxy Configuration

nginx
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;   # Forward to Node.js

        # Required request headers
        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;

        # Timeout settings
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

WebSocket Proxy

nginx
location /ws/ {
    proxy_pass http://127.0.0.1:3001;

    # Required headers for WebSocket
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

Multi-Path Proxy

nginx
server {
    listen 80;
    server_name example.com;

    # Frontend
    location / {
        root /var/www/frontend/dist;
        try_files $uri $uri/ /index.html;
    }

    # Backend API
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # Admin panel
    location /admin/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}