A simple nginx reverse proxy for serving multiple Node.js apps from subfolders
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
→ I wrote 17 books to help you become a better developer, download them all at $0 cost by joining my newsletter
→ JOIN MY CODING BOOTCAMP, an amazing cohort course that will be a huge step up in your coding career - covering React, Next.js - next edition February 2025