Nginx as Reverse Proxy

A reverse proxy allows Nginx to receive requests on port 80/443 and forward them to an application running on an internal port (e.g. 3000, 8000, 8080). This way you can expose multiple applications on the same server with different domains, manage SSL centrally and add caching.

02

Basic configuration: app on local port

Example: you have an application running on localhost:3000 and want to expose it on app.example.com.

bash
nano /etc/nginx/sites-available/app.example.com
nginx
server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        # Headers required for WebSocket and modern apps
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
    }
}

Enable and reload:

bash
ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Then add SSL with Certbot:

bash
certbot --nginx -d app.example.com
03

Multiple applications on the same server

You can host multiple apps with different domains, each on its own port:

nginx
# App 1: Node.js on port 3000
server {
    listen 80;
    server_name api.example.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

# App 2: Python on port 8000
server {
    listen 80;
    server_name dashboard.example.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}
04

Proxy for WebSocket

If your app uses WebSocket (e.g. Socket.io, real-time chat):

nginx
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400;   # 24 hours for long-lived WebSocket connections
}
05

Proxy with path: multiple apps on same domain

To expose different apps on paths of the same domain:

nginx
server {
    listen 80;
    server_name example.com;

    # Main site
    location / {
        root /var/www/html;
        index index.html;
    }

    # API on /api/ → port 3000
    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 on /admin/ → port 8080
    location /admin/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
06

Timeout and upload size

nginx
server {
    # ...
    proxy_connect_timeout 60s;
    proxy_send_timeout    60s;
    proxy_read_timeout    60s;

    # Maximum upload size (e.g. 100MB)
    client_max_body_size 100M;
}
07

Verify and debug

bash
# Test configuration
nginx -t

# Reload without downtime
systemctl reload nginx

# See proxy errors in real time
tail -f /var/log/nginx/error.log

# See incoming requests
tail -f /var/log/nginx/access.log

See also: Node.js with PM2 | LEMP Stack

DeluxHost, gegründet 2023, bietet hochwertige Hosting-Lösungen für verschiedene digitale Anforderungen. Wir bieten Shared Hosting, VPS und dedizierte Server mit erweiterter Sicherheit und globalen Rechenzentren.

© DeluxHost, Alle Rechte vorbehalten. | USt-IdNr.: IT17734661006
Alle Systeme betriebsbereit