โ† flaviocopes.com

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

Published Aug 13 2020

Psssst! The 2023 WEB DEVELOPMENT BOOTCAMP is starting on FEBRUARY 01, 2023! SIGNUPS ARE NOW OPEN to this 10-weeks cohort course. Learn the fundamentals, HTML, CSS, JS, Tailwind, React, Next.js and much more! โœจ

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 write books for developers ๐Ÿ‘‡๐Ÿผ

© 2023 Flavio Copes Flavio Copes made in Italy ๐Ÿ‡ฎ๐Ÿ‡น using Notion to Site Notion to Site