Jak wdrożyć aplikację NestJS z Nginx na serwerze VPS Ubuntu

Słów kilka o wprowadzeniu

NestJS, bazujący na Node.js framework JavaScript, implementuje architekturę Model-View-Controller (MVC). Jest doskonałym narzędziem do tworzenia efektywnych, skalowalnych i łatwo testowalnych aplikacji po stronie serwera. Z kolei Nginx, będący open-source’owym serwerem WWW, gwarantuje wysoką przepustowość, stabilność oraz bezpieczeństwo działania.

W tym przewodniku omówimy szczegółowo proces umieszczania aplikacji NestJS na serwerze VPS Ubuntu, wykorzystując do tego Nginx.

Przygotowanie środowiska

Niezbędne elementy:

  • Serwer VPS z systemem Ubuntu 20.04
  • Zainstalowane Node.js w wersji 16 lub nowszej
  • Opcjonalnie – serwer bazy danych MongoDB
  • Dowolny edytor tekstu

Konfiguracja serwera kro po kroku

1. Logowanie do serwera

Zaloguj się do serwera VPS Ubuntu jako administrator (root) za pomocą protokołu SSH:

ssh root@twoj_adres_ip

2. Aktualizacja systemu

Upewnij się, że system operacyjny serwera jest aktualny:

sudo apt update && sudo apt upgrade

Instalacja Node.js oraz NestJS

1. Instalacja środowiska Node.js

Dodaj repozytorium NodeSource do systemu:

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -

Zainstaluj Node.js za pomocą menadżera pakietów:

sudo apt install nodejs

2. Instalacja NestJS CLI (globalnie)

Zainstaluj interfejs wiersza poleceń NestJS globalnie, aby móc tworzyć projekty:

npm install -g @nestjs/cli

Tworzenie projektu NestJS

1. Inicjalizacja nowego projektu

Utwórz folder dla projektu i przejdź do niego:

mkdir moj-projekt-nest
cd moj-projekt-nest

Wygeneruj nowy projekt NestJS, wykorzystując CLI:

nest new moj-projekt

2. Instalacja zależności projektu

Wejdź do folderu projektu:

cd moj-projekt

Zainstaluj potrzebne zależności, korzystając z npm:

npm install

Konfiguracja bazy danych (opcjonalnie)

Jeżeli twoja aplikacja NestJS korzysta z bazy danych, np. MongoDB, wykonaj poniższe instrukcje:

1. Instalacja MongoDB

Dodaj repozytorium MongoDB do systemu:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list

sudo apt update
sudo apt install -y mongodb-org

2. Uruchomienie MongoDB

Włącz oraz skonfiguruj automatyczne uruchamianie usługi MongoDB:

sudo systemctl start mongod
sudo systemctl enable mongod

3. Konfiguracja połączenia w NestJS

Zmodyfikuj plik app.module.ts, aby umożliwić połączenie z bazą MongoDB:

import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost:27017/moja-baza-danych'),
  ],
})
export class AppModule {}

Konfiguracja serwera Nginx

1. Instalacja Nginx

Zainstaluj Nginx, popularny serwer WWW:

sudo apt install nginx

2. Konfiguracja bloku serwera Nginx

Utwórz nowy plik konfiguracyjny bloku serwera:

sudo nano /etc/nginx/sites-available/mojaplikacja.conf

Wklej poniższą konfigurację, zmieniając twojadomena.pl na adres swojej domeny:

server {
  listen 80;
  server_name twojadomena.pl;

  location / {
    proxy_pass http://localhost:3000;
  }
}

3. Włączenie bloku serwera

Aktywuj nowo utworzony blok serwera:

sudo ln -s /etc/nginx/sites-available/mojaplikacja.conf /etc/nginx/sites-enabled/

4. Testowanie i restart Nginx

Sprawdź poprawność konfiguracji:

sudo nginx -t

Jeżeli nie występują błędy, zrestartuj Nginx:

sudo systemctl restart nginx

Proces wdrażania aplikacji

1. Kompilacja aplikacji NestJS

Przygotuj aplikację do środowiska produkcyjnego:

npm run build

2. Kopiowanie skompilowanej aplikacji

Przenieś skompilowane pliki do katalogu, z którego korzysta Nginx:

sudo cp -r dist/* /usr/share/nginx/html/

3. Weryfikacja działania aplikacji

Przejdź do swojej domeny w przeglądarce, aby upewnić się, że aplikacja działa poprawnie.

Zabezpieczenie połączenia za pomocą SSL (opcjonalnie)

Zabezpieczenie transmisji danych za pomocą certyfikatu SSL:

1. Generowanie klucza prywatnego

Utwórz klucz prywatny RSA (2048 bitów):

openssl genrsa -out cert.key 2048

2. Utworzenie CSR

Wygeneruj żądanie podpisania certyfikatu (CSR), które należy przekazać do urzędu certyfikacji:

openssl req -new -key cert.key -out cert.csr

3. Uzyskanie certyfikatu SSL

Wyślij CSR do CA, aby uzyskać certyfikat, który zapisz jako cert.pem.

4. Konfiguracja Nginx

Dodaj następujące ustawienia do konfiguracji bloku serwera Nginx:

server {
  listen 443 ssl;
  server_name twojadomena.pl;

  ssl_certificate /etc/nginx/ssl/cert.pem;
  ssl_certificate_key /etc/nginx/ssl/cert.key;

  location / {
    proxy_pass http://localhost:3000;
  }
}

Zrestartuj Nginx, aby zmiany zaczęły obowiązywać:

sudo systemctl restart nginx

Wykorzystanie PM2 (opcjonalnie)

PM2 to menedżer procesów Node.js, który umożliwia uruchomienie aplikacji w tle oraz zarządzanie nią:

1. Instalacja PM2

Zainstaluj PM2 globalnie:

npm install -g pm2

2. Uruchomienie aplikacji za pomocą PM2

Wejdź do katalogu aplikacji i uruchom ją przy pomocy PM2:

cd moj-projekt
pm2 start npm --name mojaaplikacja -- run start

Odwrotne serwery proxy (opcjonalnie)

Wdrożenie odwrotnych serwerów proxy, takich jak Apache lub HAProxy, może być pomocne przy rozdzielaniu ruchu na kilka serwerów:

1. Konfiguracja Apache (odwrotny serwer proxy)

Konfiguracja serwera Apache jako odwrotnego serwera proxy nie jest omówiona w tym artykule. Szczegóły znajdziesz w dokumentacji Apache.

2. Konfiguracja HAProxy (odwrotny serwer proxy)

Podobnie, konfiguracja HAProxy jako odwrotnego serwera proxy wykracza poza zakres niniejszego poradnika. Zapraszamy do zapoznania się z dokumentacją HAProxy.

Podsumowanie

W tym artykule szczegółowo przedstawiliśmy proces wdrożenia aplikacji NestJS z wykorzystaniem serwera Nginx na platformie VPS Ubuntu. Opisaliśmy wszystkie kroki, od przygotowania serwera, poprzez instalację potrzebnego oprogramowania, po konfigurację i wdrożenie aplikacji. Dzięki tym wskazówkom będziesz w stanie stworzyć wydajną i skalowalną platformę dla swojej aplikacji.

Korzyści z wdrożenia NestJS z Nginx:

  • Wysoka wydajność: Nginx cechuje się wysoką efektywnością i zdolnością do obsługi dużego ruchu.
  • Skalowalność: Nginx można łatwo dostosować do rosnącego obciążenia serwera.
  • Bezpieczeństwo: Nginx oferuje wiele opcji zwiększających bezpieczeństwo aplikacji.