Node.js installeren op Debian 10 en Nginx instellen als Frontend Proxy Server

Node.js is een gratis en open-source JavaScript platform dat gebruikt kan worden om dynamische en responsieve server-side inhoud te serveren. Het is gebouwd op Chrome’s V8 JavaScript motor en kan JavaScript code uitvoeren buiten een webbrowser om. Het kan op verschillende besturingssystemen draaien, waaronder, Linux, FreeBSD, Windows, en macOS. Node.js werkt ook op andere webservers zoals Apache en Nginx.

In deze handleiding leren we hoe je Node.js installeert en configureert om backend verzoeken af te handelen en Nginx configureert om front-end verzoeken af te handelen op Debian 10.

Vereisten

  • Een server met Debian 10.
  • Een root wachtwoord is op je server ingesteld.

Aan de slag

Eerst is het aan te raden je systeem naar de nieuwste versie bij te werken. Je kunt dat doen met het volgende commando:

apt-get update -y
apt-get upgrade -y

Als je server bijgewerkt is, herstart je hem om de veranderingen toe te passen.

Installeer Node.js

Standaard is de nieuwste versie van Node.js niet beschikbaar in de standaard repository van Debian 10. Je zult het dus vanuit het script moeten installeren.

Installeer eerst curl met het volgende commando:

apt-get install curl -y

Download en installeer vervolgens het Node.js installatie script met het volgende commando:

curl -sL https://deb.nodesource.com/setup_12.x | bash -

Als de installatie voltooid is, kun je het Node.js installeren met het volgende commando:

apt-get install nodejs -y

Als de installatie met succes voltooid is, kun je de Node.js versie verifiëren met het volgende commando:

nodejs --version

Je zou de Node.js versie moeten zien in de volgende uitvoer:

v12.16.1

Je kunt ook de NPM versie controleren door het volgende commando uit te voeren:

npm --version

Je zou de NPM versie moeten zien in de volgende uitvoer:

6.13.4

Creëer Node.js toepassing

Eerst moet je een directory maken voor je toepassing. Je kunt die aanmaken door het volgende commando uit te voeren:

mkdir nodeapp

Verander de directory vervolgens in nodeapp en installeer express met het volgende commando:

cd nodeapp
npm install express

Maak vervolgens een voorbeeld Node.js toepassing met express met de nano editor:

nano app.js

Voeg de volgende inhoud toe:

var express = require('express');
var app = express();
app.get('/', function(req, res){
   res.send("Nginx as Frontend Server for Node.js!");
});
app.listen(8000, '127.0.0.1');

Sla het bestand op en sluit het als je klaar bent.

Voer vervolgens je toepassing uit met het volgende commando:

node app.js

Open vervolgens andere terminal en controleer de toepassing met het volgende commando:

netstat -antup | grep 8000

Je zou moeten zien dat je Node.js toepassing luistert op poort 8000:

tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      26193/node

Je kunt de toepassing ook verifiëren met het commando curl, zoals hieronder te zien is:

curl http://127.0.0.1:8000

Als alles in orde is, zou je de volgende uitvoer moeten krijgen:

Nginx as Frontend Server for Node.js!

Installeer en configureer PM2

PM2 is een procesmanager om Node.js toepassingen te beheren. Je kunt gemakkelijk Node.js toepassing starten, stoppen en inschakelen om te starten bij het opstarten met PM2.

Installeer eerst de nieuwste versie van PM2 met NPM zoals hieronder getoond:

npm install pm2 -g

Eenmaal geïnstalleerd, verander je de directory in nodeapp en je toepassing met het volgende commando:

cd nodeapp
pm2 start app.js

Zodra de toepassing gestart is, zou je de volgende uitvoer moeten krijgen:

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
 _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /root/nodeapp/app.js in fork_mode (1 instance)
[PM2] Done.
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? id  ? name   ? namespace   ? version ? mode    ? pid      ? uptime ? ?    ? status    ? cpu      ? mem      ? user     ? watching ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 0   ? app    ? default     ? N/A     ? fork    ? 13202    ? 0s     ? 0    ? online    ? 0%       ? 27.2mb   ? root     ? disabled ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

In de bovenstaande uitvoer kun je heel nuttige informatie zien zoals, applicatie PID, uptime, status, CPU en Geheugen gebruik.

Voer vervolgens het volgende commando uit om een opstartscript voor Node.js toepassing te maken en in te stellen, zodat je Node.js toepassing automatisch start bij het opstarten.

pm2 startup

Je zou de volgende uitvoer moeten krijgen:

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

Start vervolgens de PM2 dienst met het volgende commando:

systemctl start pm2-root

Controleer vervolgens de status van de PM2 dienst met het volgende commando:

systemctl status pm2-root

Je zou de volgende uitvoer moeten krijgen:

? pm2-root.service - PM2 process manager
   Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-03-26 06:04:28 UTC; 2s ago
     Docs: https://pm2.keymetrics.io/
  Process: 13387 ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS)
 Main PID: 13191 (PM2 v4.2.3: God)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/pm2-root.service
           ? 13191 PM2 v4.2.3: God Daemon (/root/.pm2)

Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2] Restoring processes located in /root/.pm2/dump.pm2.bak
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2][ERROR] Failed to read dump file in /root/.pm2/dump.pm2.bak
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2][ERROR] No processes saved; DUMP file doesn't exist
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? PM2+ activated | Instance Name: node.myserver.tld-109e | Dash: https://app.pm2.io/#/r/7p66twg
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? id  ? name   ? namespace   ? version ? mode    ? pid      ? uptime ? ?    ? status    ? cpu   
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? 0   ? app    ? default     ? N/A     ? fork    ? 13202    ? 8m     ? 0    ? online    ? 0%    
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com systemd[1]: Started PM2 process manager.

Configureer Nginx als een Reverse Proxy voor Node.js

Op dit punt draait je Node.js toepassing en luistert ze op de localhost. Nu moet je Nginx instellen als een omgekeerde proxy server voor de Node.js toepassing, zodat elke gebruiker je toepassing over het internet kan benaderen.

Installeer eerst de Nginx webserver met het volgende commando:

apt-get install nginx -y

Maak, eenmaal geïnstalleerd, een Nginx virtual host configuratiebestand voor de Node.js toepassing:

nano /etc/nginx/sites-enabled/myapp.conf

Voeg de volgende inhoud toe:

server {
    listen 80;
    server_name node.myserver.tld;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
     }
}

Sla het bestand op en sluit het als je klaar bent. Herstart dan de Nginx server om de veranderingen toe te passen:

systemctl restart nginx

Je kunt de status van de Nginx dienst controleren met het volgende commando:

systemctl status nginx

Je zou de volgende uitvoer moeten zien:

? nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-03-25 12:42:49 UTC; 5min ago
     Docs: man:nginx(8)
  Process: 26180 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 26182 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 26183 (nginx)
    Tasks: 3 (limit: 2359)
   Memory: 5.5M
   CGroup: /system.slice/nginx.service
           ??26183 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ??26184 nginx: worker process
           ??26185 nginx: worker process

Mar 25 12:42:49 debian10 systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 25 12:42:49 debian10 systemd[1]: Started A high performance web server and a reverse proxy server.

Als je klaar bent, kun je verder gaan met de volgende stap.

Toegang tot je Node.js toepassing

Op dit punt is Nginx geconfigureerd om je Node.js toepassing te serveren.

Open nu je webbrowser en typ de URL http://node.myserver.tld. Je zou je Node.js toepassing in het volgende scherm moeten zien:

Node.js pagina

Conclusie

In het bovenstaande artikel heb je geleerd hoe je een Node.js toepassing kunt instellen op Debian 10. Je leerde ook hoe de Node.js toepassing als daemon te draaien en Nginx als reverse proxy in te stellen om de toepassing te serveren. Ik hoop dat je nu gemakkelijk je Node.js toepassing in een productie omgeving kunt hosten.