Hoe u een Node.js-toepassing instelt voor productie op Rocky Linux 9

Introductie

Node.js is een open-source JavaScript runtime-omgeving voor het bouwen van server-side en netwerktoepassingen. Het platform draait op Linux, macOS, FreeBSD en Windows. Hoewel je Node.js-toepassingen vanaf de opdrachtregel kunt uitvoeren, zal deze handleiding zich richten op het uitvoeren ervan als een service. Dit betekent dat ze opnieuw worden opgestart bij het opnieuw opstarten of bij een storing en veilig zijn voor gebruik in een productieomgeving.

In deze handleiding stel je een productieklare Node.js-omgeving in op een enkele Rocky Linux 9-server. Deze server zal een door PM2 beheerde Node.js-toepassing uitvoeren en gebruikers voorzien van veilige toegang tot de toepassing via een Nginx-reverse proxy. De Nginx-server zal HTTPS aanbieden met behulp van een gratis certificaat van Let’s Encrypt.

Vereisten

Deze handleiding gaat ervan uit dat je het volgende hebt:

Wanneer je de vereisten hebt voltooid, zal je server de standaard placeholder-pagina van je domein bedienen op https://example.com/.

Stap 1 — Het creëren van een Node.js-toepassing

Laten we een Hello World toepassing schrijven die “Hello World” teruggeeft bij elke HTTP-aanvraag. Deze voorbeeldtoepassing zal je helpen bij het opstarten met Node.js. Je kunt het vervangen door je eigen toepassing, zorg er gewoon voor dat je de toepassing wijzigt om te luisteren op de juiste IP-adressen en poorten.

De standaard teksteditor die wordt geleverd met Rocky Linux 9 is vi. vi is een zeer krachtige teksteditor, maar kan enigszins ondoorzichtig zijn voor gebruikers zonder ervaring ermee. Je wilt misschien een meer gebruiksvriendelijke editor zoals nano installeren om het bewerken van configuratiebestanden op je Rocky Linux 9-server te vergemakkelijken.

  1. sudo dnf install nano

Nu, met behulp van nano of je favoriete teksteditor, maak een voorbeeldtoepassing genaamd hello.js:

  1. nano hello.js

Voeg de volgende code in het bestand in:

~/hello.js
const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Sla het bestand op en verlaat de editor. Als je nano gebruikt, druk dan op Ctrl+X, en wanneer gevraagd, Y en dan Enter.

Deze Node.js-toepassing luistert op het opgegeven adres (localhost) en poort (3000), en geeft “Hello World!” terug met een 200 HTTP-succescode. Omdat we luisteren op localhost, kunnen externe clients geen verbinding maken met onze toepassing.

Om je toepassing te testen, typ:

  1. node hello.js

Je ontvangt de volgende uitvoer:

Output
Server running at http://localhost:3000/

Opmerking: Het uitvoeren van een Node.js-toepassing op deze manier zal extra commando’s blokkeren totdat de toepassing wordt gestopt door op CTRL+C te drukken.

Om de toepassing te testen, open een andere terminalsessie op je server en maak verbinding met localhost met curl:

  1. curl http://localhost:3000

Als je de volgende uitvoer krijgt, werkt de toepassing correct en luistert op het juiste adres en de juiste poort:

Output
Hello World!

Als je niet de verwachte uitvoer krijgt, zorg ervoor dat je Node.js-toepassing draait en geconfigureerd is om te luisteren op het juiste adres en de juiste poort.

Zodra je zeker weet dat het werkt, stop de toepassing (als je dat nog niet hebt gedaan) door op CTRL+C te drukken.

Stap 2 — PM2 installeren

Laten we nu PM2 installeren, een procesbeheerder voor Node.js-toepassingen. PM2 maakt het mogelijk om toepassingen te daemoniseren zodat ze op de achtergrond als een service kunnen worden uitgevoerd.

Gebruik npm om de nieuwste versie van PM2 op uw server te installeren:

  1. sudo npm install pm2@latest -g

De -g optie vertelt npm om de module globaal te installeren, zodat deze systeembreed beschikbaar is.

Laten we eerst het pm2 start commando gebruiken om uw toepassing, hello.js, op de achtergrond uit te voeren:

  1. pm2 start hello.js

Dit voegt ook uw toepassing toe aan de proceslijst van PM2, die telkens wordt weergegeven wanneer u een toepassing start:

Output
... [PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/sammy/hello.js in fork_mode (1 instance) [PM2] Done. ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ memory │ ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤ │ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │ └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

Zoals hierboven aangegeven, wijst PM2 automatisch een App-naam toe (gebaseerd op de bestandsnaam, zonder de .js-extensie) en een PM2 id toe. PM2 onderhoudt ook andere informatie, zoals de PID van het proces, de huidige status en het geheugengebruik.

Toepassingen die onder PM2 worden uitgevoerd, worden automatisch opnieuw gestart als de toepassing crasht of wordt beëindigd. We kunnen echter een extra stap nemen om de toepassing te laten starten bij het opstarten van het systeem met behulp van de startup subopdracht. Deze subopdracht genereert en configureert een opstartscript om PM2 en de beheerde processen bij het opstarten van de server te starten:

  1. pm2 startup systemd
Output
… [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Kopieer en voer het opgegeven commando uit (dit is om problemen met machtigingen te voorkomen bij het uitvoeren van Node.js-tools als sudo):

  1. sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Output
… [ 'systemctl enable pm2-sammy' ] [PM2] Writing init configuration in /etc/systemd/system/pm2-sammy.service [PM2] Making script booting at startup... [PM2] [-] Executing: systemctl enable pm2-sammy... Created symlink /etc/systemd/system/multi-user.target.wants/pm2-sammy.service → /etc/systemd/system/pm2-sammy.service. [PM2] [v] Command successfully executed. +---------------------------------------+ [PM2] Freeze a process list on reboot via: $ pm2 save [PM2] Remove init script via: $ pm2 unstartup systemd

Nu moet je een bewerking maken in de systeemservice die zojuist is gegenereerd om deze compatibel te maken met het SELinux-beveiligingssysteem van Rocky Linux. Gebruik nano of je favoriete teksteditor om /etc/systemd/system/pm2-sammy.service te openen:

  1. sudo nano /etc/systemd/system/pm2-sammy.service

In het [Service]-blok van het configuratiebestand, vervang de inhoud van de PIDFile-instelling door /run/pm2.pid zoals hieronder gemarkeerd, en voeg de andere gemarkeerde Environment-regel toe:

/etc/systemd/system/pm2-sammy.service
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

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

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

[Install]

Sla het bestand op en sluit het. Je hebt nu een systemd eenheid gemaakt die pm2 uitvoert voor je gebruiker bij het opstarten. Deze pm2-instantie voert op zijn beurt hello.js uit.

Start de service met systemctl:

  1. sudo systemctl start pm2-sammy

Controleer de status van de systemd-eenheid:

  1. systemctl status pm2-sammy

Voor een gedetailleerd overzicht van systemd, bekijk Systemd Essentials: Werken met Services, Units en de Journal.

Naast degenen die we hebben behandeld, biedt PM2 vele subopdrachten waarmee je informatie over je toepassingen kunt beheren of opzoeken.

Stop een toepassing met dit commando (specificeer de PM2 App-naam of id):

  1. pm2 stop app_name_or_id

Herstart een toepassing:

  1. pm2 restart app_name_or_id

Lijst de momenteel beheerde toepassingen op met PM2:

  1. pm2 list

Krijg informatie over een specifieke toepassing met behulp van de App-naam:

  1. pm2 info app_name

De PM2-procesmonitor kan worden opgeroepen met het monit subcommando. Dit geeft de toepassingsstatus, CPU- en geheugengebruik weer:

  1. pm2 monit

Merk op dat het uitvoeren van pm2 zonder argumenten ook een helppagina met voorbeeldgebruik weergeeft.

Nu uw Node.js-toepassing draait en beheerd wordt door PM2, laten we de omgekeerde proxy instellen.

Stap 3 — Nginx instellen als omgekeerde proxyserver

Uw toepassing draait en luistert op localhost, maar u moet een manier instellen voor uw gebruikers om er toegang toe te krijgen. We zullen de Nginx-webserver instellen als een omgekeerde proxy voor dit doel.

In de vereiste zelfstudie hebt u uw Nginx-configuratie ingesteld in het bestand /etc/nginx/conf.d/uw_domein.conf. Open dit bestand om te bewerken:

  1. sudo nano /etc/nginx/conf.d/your_domain.conf

Binnen het server-blok moet u een bestaand location /-blok hebben. Vervang de inhoud van dat blok door de volgende configuratie. Als uw toepassing is ingesteld om naar een ander poort te luisteren, werk dan het gemarkeerde gedeelte bij naar het juiste poortnummer:

/etc/nginx/conf.d/your_domain.conf
server {
...
    location / {
        proxy_pass http://localhost:3000;
        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;
    }
...
}

Dit configureert de server om te reageren op verzoeken op zijn root. Als we aannemen dat onze server beschikbaar is op your_domain, zou het openen van https://your_domain/ via een webbrowser het verzoek naar hello.js sturen, dat luistert op poort 3000 op localhost.

Je kunt extra location-blokken toevoegen aan hetzelfde serverblok om toegang te geven tot andere toepassingen op dezelfde server. Bijvoorbeeld, als je nog een andere Node.js-toepassing draait op poort 3001, zou je dit locatieblok kunnen toevoegen om toegang mogelijk te maken via https://your_domain/app2:

/etc/nginx/conf.d/your_domain.conf — Optional
server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        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;
    }
...
}

Zodra je klaar bent met het toevoegen van de locatieblokken voor je toepassingen, sla het bestand op en verlaat je de editor.

Zorg ervoor dat je geen syntaxisfouten hebt geïntroduceerd door het volgende te typen:

  1. sudo nginx -t

Herstart Nginx:

  1. sudo systemctl restart nginx

Assumeer dat je Node.js-toepassing draait en dat je toepassings- en Nginx-configuraties correct zijn, dan zou je nu toegang moeten hebben tot je toepassing via de Nginx-reverse proxy. Probeer het uit door toegang te krijgen tot de URL van je server (het openbare IP-adres of de domeinnaam).

Conclusie

Gefeliciteerd! Je hebt nu je Node.js-toepassing draaien achter een Nginx-reverse proxy op een Rocky Linux 9-server. Deze reverse proxy-opstelling is flexibel genoeg om je gebruikers toegang te bieden tot andere toepassingen of statische webinhoud die je wilt delen.

Volgende, wil je misschien kijken naar Hoe je een Node.js applicatie kunt bouwen met Docker.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-rocky-linux-9