Nginx: A simple nginx reverse proxy for serving multiple Node.js apps from subfolders

Join the AI Workshop to learn more about AI and how it can be applied to web development. Next cohort February 1st, 2026

The AI-first Web Development BOOTCAMP cohort starts February 24th, 2026. 10 weeks of intensive training and hands-on projects.


I recently set up a VPS on DigitalOcean to run a few different Node.js scripts under the same domain.

Now, you can’t have two different Node.js apps listen on the same port, so you have to use a reverse proxy. Nginx is commonly used for that.

I set up each Node app to run on its own subfolder, so I had to edit the Nginx configuration:

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

which was this:

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name hellonode;

        location ^~ /assets/ {
                gzip_static on;
                expires 12h;
                add_header Cache-Control public;
        }

        location / {
                proxy_http_version 1.1;
                proxy_cache_bypass $http_upgrade;

                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_pass http://localhost:3000;
        }
}

This configuration allows one Node.js app, running on port 3000, to be the main app served on /.

I wanted to have an app running under /myservice, so I created a Node app listening on port 3001 and I added this configuration:

location /myservice {
        rewrite ^/myservice/(.*)$ /$1 break;

        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;

        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_pass http://localhost:3001;
}

I checked the configuration was fine using

sudo nginx -t

and I restarted nginx:

sudo systemctl restart nginx

Lessons in this unit:

0: Introduction
1: What is a reverse proxy?
2: How to configure Nginx for HTTPS
3: ▶︎ A simple nginx reverse proxy for serving multiple Node.js apps from subfolders