Un proxy inverso nginx simple para servir múltiples aplicaciones Node.js desde subcarpetas

Recientemente configuré un VPS en DigitalOcean para ejecutar algunos scripts de Node.js diferentes bajo el mismo dominio.

Ahora, no puede hacer que dos aplicaciones Node.js diferentes escuchen en el mismo puerto, por lo que debe usar un proxy inverso. Nginx se usa comúnmente para eso.

Configuré cada aplicación de nodo para que se ejecutara en su propia subcarpeta, así que tuve que editar la configuración de Nginx:

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  

More network tutorials: