15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
09.10.2024

Cara Menginstal Node.js dan PM2 di Ubuntu: Panduan Produksi Lengkap

Node.js adalah runtime JavaScript asinkron berbasis event yang dibangun di atas mesin V8 Chrome, dirancang untuk mengeksekusi kode JavaScript di sisi server dengan throughput tinggi. PM2 adalah process manager tingkat produksi untuk aplikasi Node.js yang menyediakan daemonisasi, pemulihan crash otomatis, agregasi log, load balancing mode cluster, dan pembuatan skrip startup — semuanya dari satu antarmuka CLI.

Panduan ini mencakup setiap metode instalasi, opsi konfigurasi, dan pola operasional yang Anda butuhkan untuk menjalankan aplikasi Node.js secara andal di Ubuntu 20.04, 22.04, atau 24.04 LTS dalam lingkungan produksi.

Prasyarat

Sebelum melanjutkan, konfirmasi hal-hal berikut:

  • Sistem operasi: Ubuntu 20.04, 22.04, atau 24.04 LTS (server atau desktop)
  • Hak pengguna: `sudo` atau akses root
  • Akses jaringan: HTTPS keluar untuk mengunduh paket dan skrip
  • curl terinstal: Jalankan `sudo apt install curl -y` jika belum ada

Jika Anda menjalankan ini di server cloud, lingkungan VPS Hosting adalah target deployment paling umum untuk beban kerja Node.js, dan semua yang ada dalam panduan ini berlaku secara langsung.

Langkah 1: Perbarui Paket Sistem

Selalu sinkronkan indeks paket Anda dan terapkan pembaruan yang tertunda sebelum menginstal perangkat lunak baru. Metadata paket yang usang adalah sumber umum konflik dependensi.

“`bash

sudo apt update

sudo apt upgrade -y

“`

Setelah pembaruan selesai, reboot jika kernel diperbarui:

“`bash

sudo reboot

“`

Langkah 2: Instal Node.js — Memilih Metode yang Tepat

Ada tiga metode instalasi utama untuk Node.js di Ubuntu. Masing-masing memiliki trade-off yang berbeda dalam hal kontrol versi, isolasi, dan ketersediaan di seluruh sistem.

Perbandingan Metode

FiturNodeSource (apt)NVMSystem apt (universe)
Kontrol versiSatu versi major yang dipinnedBeberapa versi per penggunaBiasanya LTS yang sudah usang
Instalasi seluruh sistemYaTidak (per-pengguna secara default)Ya
Pergantian versiPerlu menjalankan ulang skrip setup`nvm use <version>`Tidak didukung
Terbaik untukCI/CD, server satu versiPengembangan, multi-proyekPengujian cepat saja
sudo diperlukan untuk npm globalsYaTidakYa
Kesesuaian produksiTinggiSedangRendah

Metode 1: Instal Node.js via NodeSource (Direkomendasikan untuk Server)

NodeSource memelihara repositori Debian/Ubuntu yang selalu diperbarui untuk setiap lini rilis Node.js yang aktif. Ini adalah pendekatan yang disukai untuk server produksi di mana satu versi yang stabil diperlukan di seluruh sistem.

Tambahkan repositori NodeSource untuk rilis LTS saat ini:

“`bash

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash –

“`

Skrip ini melakukan beberapa tindakan: mendeteksi versi Ubuntu Anda, menambahkan repositori apt NodeSource yang sesuai, mengimpor kunci penandatanganan GPG, dan menjalankan `apt-get update`. Flag `-E` mempertahankan variabel lingkungan Anda saat eskalasi ke sudo, yang penting jika Anda memiliki pengaturan proxy yang dikonfigurasi.

Instal Node.js dan npm:

“`bash

sudo apt install nodejs -y

“`

Paket NodeSource menggabungkan `node` dan `npm` dalam satu paket `nodejs`. Tidak seperti paket universe Ubuntu, keduanya tidak dipisahkan.

Verifikasi instalasi:

“`bash

node -v

npm -v

“`

Contoh output yang diharapkan:

“`

v20.14.0

10.7.0

“`

Pinning ke versi major tertentu: Jika Anda membutuhkan Node.js 18 alih-alih LTS saat ini, ganti `setup_lts.x` dengan `setup_18.x` dalam perintah curl. Stream yang tersedia meliputi `setup_18.x`, `setup_20.x`, dan `setup_22.x`.

Metode 2: Instal Node.js via NVM (Direkomendasikan untuk Pengembangan dan Lingkungan Multi-Versi)

NVM (Node Version Manager) menginstal Node.js ke direktori home Anda, tidak memerlukan hak root untuk Node.js itu sendiri maupun paket npm yang diinstal secara global. Ini menghilangkan masalah izin yang umum terjadi saat menjalankan `npm install -g` pada Node.js yang diinstal di sistem.

Instal NVM:

“`bash

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

“`

Periksa repositori NVM resmi untuk tag rilis terbaru sebelum menjalankan perintah ini — nomor versi dalam URL berubah setiap rilis.

Muat ulang lingkungan shell Anda:

“`bash

source ~/.bashrc

“`

Jika Anda menggunakan Zsh, source `~/.zshrc` sebagai gantinya. Installer NVM menambahkan blok inisialisasinya ke file konfigurasi shell mana pun yang terdeteksi.

Instal versi LTS terbaru dari Node.js:

“`bash

nvm install –lts

“`

Instal versi tertentu bersamaan dengan LTS:

“`bash

nvm install 18

nvm install 20

“`

Beralih antara versi yang terinstal:

“`bash

nvm use 20

nvm alias default 20

“`

Perintah `alias default` menetapkan versi yang aktif di sesi shell baru, yang sangat penting untuk skrip dan cron job yang tidak men-source profil shell interaktif Anda.

Verifikasi:

“`bash

node -v

npm -v

“`

Jebakan kritis NVM untuk produksi: Karena NVM bersifat per-pengguna, skrip startup PM2 dan unit systemd tidak akan memiliki akses ke binary Node.js yang dikelola NVM kecuali Anda mengonfigurasi path secara eksplisit. Lihat Langkah 5 untuk cara menangani ini dengan benar.

Langkah 3: Instal PM2

PM2 didistribusikan sebagai paket npm dan harus diinstal secara global agar CLI-nya tersedia di seluruh sistem.

Instal PM2:

“`bash

sudo npm install -g pm2

“`

Jika Anda menginstal Node.js via NVM, hilangkan `sudo`:

“`bash

npm install -g pm2

“`

Verifikasi instalasi:

“`bash

pm2 -v

“`

Instal versi PM2 tertentu (berguna saat melakukan pinning infrastruktur):

“`bash

sudo npm install -g pm2@5.3.1

“`

PM2 versi 5.x adalah lini stabil saat ini. Versi ini memperkenalkan peningkatan signifikan pada dasbor web (pm2 plus), rotasi log, dan sistem modul dibandingkan v4.

Langkah 4: Mengelola Aplikasi Node.js dengan PM2

Memulai Aplikasi

Navigasikan ke direktori aplikasi Anda dan mulai:

“`bash

cd /var/www/my-app

pm2 start app.js –name "my-app"

“`

Selalu tetapkan flag `–name`. Tanpanya, PM2 menggunakan nama file sebagai nama proses, yang menjadi ambigu ketika Anda memiliki beberapa layanan.

Memulai dengan opsi tambahan:

“`bash

pm2 start app.js –name "my-app" –watch –max-memory-restart 300M

“`

  • `–watch`: Memulai ulang proses ketika file sumber berubah (berguna di staging, tidak direkomendasikan di produksi)
  • `–max-memory-restart 300M`: Secara otomatis memulai ulang proses jika melebihi 300 MB memori RSS — perlindungan penting terhadap kebocoran memori

Melihat Proses yang Berjalan

“`bash

pm2 list

“`

Ini menampilkan tabel yang menunjukkan ID proses, nama, mode (fork/cluster), PID, status, penggunaan CPU, konsumsi memori, dan jumlah restart.

Untuk dasbor real-time:

“`bash

pm2 monit

“`

Mengontrol Proses

“`bash

pm2 restart my-app # Graceful restart

pm2 reload my-app # Zero-downtime reload (cluster mode only)

pm2 stop my-app # Stop without removing from process list

pm2 delete my-app # Stop and remove from process list

“`

Perbedaan antara `restart` dan `reload`: `restart` mematikan proses dan memulai yang baru, menyebabkan downtime singkat. `reload` (hanya tersedia dalam mode cluster) menggilir worker satu per satu, mempertahankan ketersediaan sepanjang proses. Selalu gunakan `reload` dalam deployment cluster produksi.

Manajemen Log

“`bash

pm2 logs # Stream logs from all processes

pm2 logs my-app # Stream logs for a specific process

pm2 logs my-app –lines 200 # Show last 200 lines

pm2 flush # Clear all log files

“`

PM2 menyimpan log di `~/.pm2/logs/` secara default. Untuk server produksi, instal modul rotasi log untuk mencegah kehabisan disk:

“`bash

pm2 install pm2-logrotate

pm2 set pm2-logrotate:max_size 50M

pm2 set pm2-logrotate:retain 10

pm2 set pm2-logrotate:compress true

“`

Ini merotasi log ketika mencapai 50 MB, menyimpan 10 arsip terkompresi, dan mencegah pertumbuhan log yang tidak terkendali — masalah umum pada server yang berjalan lama yang sering diabaikan hingga ruang disk habis.

Langkah 5: Konfigurasi PM2 untuk Mulai saat Boot Sistem

PM2 harus dikonfigurasi agar tetap berjalan setelah server reboot. Ini ditangani melalui unit layanan systemd yang dihasilkan oleh PM2 itu sendiri.

Hasilkan perintah startup:

“`bash

pm2 startup

“`

PM2 akan menampilkan perintah yang disesuaikan dengan sistem init dan pengguna saat ini. Tampilannya seperti ini:

“`

[PM2] Init System found: systemd

[PM2] To setup the Startup Script, copy/paste the following command:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu –hp /home/ubuntu

“`

Salin dan jalankan perintah tersebut persis seperti adanya. Jangan modifikasi — path ke binary PM2 dan direktori home harus sesuai dengan konfigurasi sistem Anda.

Konfigurasi startup khusus NVM: Jika Anda menginstal Node.js via NVM, path dalam perintah yang dihasilkan akan menunjuk ke binary yang dikelola NVM. Ini sudah benar, tetapi Anda harus memastikan versi NVM ditetapkan sebagai default sebelum menjalankan `pm2 startup`:

“`bash

nvm alias default 20

pm2 startup

“`

Simpan daftar proses saat ini:

“`bash

pm2 save

“`

Ini menulis daftar proses ke `~/.pm2/dump.pm2`. Saat reboot, unit systemd membaca file ini dan memulihkan semua proses yang tersimpan. Jika Anda menambah atau menghapus aplikasi nanti, jalankan `pm2 save` lagi untuk memperbarui snapshot.

Verifikasi unit systemd aktif:

“`bash

systemctl status pm2-ubuntu

“`

Ganti `ubuntu` dengan nama pengguna Anda yang sebenarnya.

Langkah 6: Deployment Produksi dengan File Ekosistem PM2

Untuk aplikasi yang lebih dari sekadar skrip tunggal, gunakan file konfigurasi ekosistem PM2. File ini menyediakan definisi proses yang dapat direproduksi dan dikontrol versinya, serta menghilangkan kebutuhan untuk mengingat flag CLI yang panjang.

Membuat File Ekosistem

“`bash

pm2 ecosystem

“`

Ini membuat `ecosystem.config.js` di direktori saat ini.

Konfigurasi Ekosistem Siap Produksi

“`javascript

module.exports = {

apps: [

{

name: 'api-server',

script: './src/server.js',

instances: 'max',

exec_mode: 'cluster',

watch: false,

max_memory_restart: '500M',

log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

error_file: '/var/log/pm2/api-server-error.log',

out_file: '/var/log/pm2/api-server-out.log',

merge_logs: true,

env: {

NODE_ENV: 'development',

PORT: 3000

},

env_production: {

NODE_ENV: 'production',

PORT: 8080

}

},

{

name: 'worker',

script: './src/worker.js',

instances: 2,

exec_mode: 'fork',

cron_restart: '0 2 * * *',

env_production: {

NODE_ENV: 'production'

}

}

]

};

“`

Penjelasan keputusan konfigurasi utama:

  • `instances: 'max'`: PM2 secara otomatis menelurkan satu worker per core CPU logis. Pada server 4-core, ini membuat 4 proses Node.js, memanfaatkan hardware sepenuhnya.
  • `exec_mode: 'cluster'`: Menggunakan modul cluster bawaan Node.js. Semua instance berbagi port yang sama melalui load balancing socket sistem operasi.
  • `exec_mode: 'fork'`: Menjalankan proses sebagai child process mandiri. Diperlukan untuk aplikasi yang bukan server HTTP (queue worker, scheduled job, server WebSocket dengan sticky session).
  • `merge_logs: true`: Menggabungkan stdout dari semua instance cluster ke dalam satu file log, membuat analisis log jauh lebih mudah.
  • `cron_restart`: Menjadwalkan restart otomatis menggunakan sintaks cron. Berguna untuk worker yang mengakumulasi state atau untuk menerapkan perubahan konfigurasi malam hari.

Memulai dengan File Ekosistem

“`bash

pm2 start ecosystem.config.js –env production

pm2 save

“`

Alur Kerja Deployment Zero-Downtime

Saat men-deploy versi baru aplikasi Anda:

“`bash

git pull origin main

npm install –production

pm2 reload ecosystem.config.js –env production

“`

`pm2 reload` mengirim `SIGINT` ke setiap worker satu per satu, menunggu worker baru siap, lalu mengakhiri yang lama. Aplikasi Anda harus menangani `SIGINT` dengan baik dan memberi sinyal kesiapan menggunakan `process.send('ready')` agar ini berfungsi dengan benar.

Handler graceful shutdown dalam aplikasi Anda:

“`javascript

process.on('SIGINT', () => {

server.close(() => {

console.log('HTTP server closed');

process.exit(0);

});

});

“`

Langkah 7: Monitoring dan Observabilitas PM2

Monitoring Bawaan

“`bash

pm2 monit

“`

Menampilkan grafik CPU dan memori real-time untuk setiap proses di terminal.

Informasi Proses

“`bash

pm2 show my-app

“`

Menampilkan metadata terperinci: uptime, jumlah restart, versioning, path interpreter, variabel lingkungan, dan lokasi file log.

Dasbor Web PM2 (PM2 Plus)

PM2 menawarkan dasbor monitoring yang dihosting di pm2.io. Hubungkan server Anda:

“`bash

pm2 link <secret_key> <public_key>

“`

Ini menyediakan metrik historis, peringatan, dan manajemen proses jarak jauh — sangat berharga saat mengelola beberapa server atau ketika Anda membutuhkan visibilitas tanpa akses SSH.

Langkah 8: Memperbarui Node.js dan PM2

Memperbarui PM2

“`bash

sudo npm install -g pm2@latest

pm2 update

“`

`pm2 update` sangat penting setelah memperbarui binary PM2 — ini memperbarui daemon PM2 dalam memori tanpa mengganggu proses yang sedang berjalan.

Memperbarui Node.js via NodeSource

Jalankan ulang skrip setup untuk versi major baru:

“`bash

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash –

sudo apt install nodejs -y

“`

Setelah memperbarui Node.js, restart PM2 untuk memastikan menggunakan binary baru:

“`bash

pm2 restart all

“`

Memperbarui Node.js via NVM

“`bash

nvm install 22

nvm alias default 22

nvm use 22

pm2 restart all

“`

Jika Anda mengubah versi default NVM, buat ulang skrip startup PM2 untuk memperbarui path binary dalam unit systemd:

“`bash

pm2 unstartup

pm2 startup

pm2 save

“`

Pertimbangan Penguatan Keamanan

Menjalankan aplikasi Node.js dalam produksi memerlukan perhatian di luar manajemen proses:

  • Jalankan sebagai pengguna non-root: Jangan pernah menjalankan PM2 atau Node.js sebagai root. Buat pengguna sistem khusus (`adduser –system –group nodeapp`) dan jalankan PM2 di bawah akun tersebut.
  • Manajemen variabel lingkungan: Jangan hardcode rahasia dalam `ecosystem.config.js`. Gunakan file `.env` yang dimuat via `dotenv`, atau injeksikan rahasia melalui pipeline deployment Anda. File ekosistem biasanya di-commit ke version control.
  • Reverse proxy: Tempatkan Nginx atau Caddy di depan aplikasi Node.js Anda. Ini menangani terminasi TLS, penyajian file statis, rate limiting, dan buffering permintaan. Padukan ini dengan solusi SSL Certificates untuk menegakkan HTTPS.
  • Aturan firewall: Blokir akses langsung ke port Node.js Anda (misalnya, 3000, 8080) dari internet publik. Hanya reverse proxy yang boleh berkomunikasi dengan Node.js.
  • Batas sumber daya: Tetapkan `max_memory_restart` di PM2 dan konfigurasikan nilai `ulimit` di tingkat sistem untuk mencegah satu proses yang tidak terkendali mendestabilisasi server.

Untuk deployment produksi dengan lalu lintas tinggi di mana isolasi sumber daya sangat penting, lingkungan Dedicated Servers memberikan kontrol hardware penuh dan menghilangkan masalah noisy-neighbor yang melekat pada infrastruktur bersama.

Memilih Lingkungan Hosting yang Tepat untuk Node.js

Beban KerjaLingkungan yang DirekomendasikanAlasan
Proyek pribadi, staging[VPS Hosting](https://alexhost.com/id/vps/)Hemat biaya, akses root penuh, skalabel
API lalu lintas tinggi[Dedicated Servers](https://alexhost.com/id/dedicated-servers/)Performa yang dapat diprediksi, tanpa persaingan sumber daya
Inferensi ML + Node.js[GPU Hosting](https://alexhost.com/id/gpu-hosting/)Alihkan tugas komputasi intensif ke GPU worker
Panel kontrol terkelola[VPS with cPanel](https://alexhost.com/id/vps/control-panels/cpanel-vps/)Manajemen proses dan file berbasis GUI

Daftar Periksa Keputusan Teknis

Gunakan daftar periksa ini sebelum men-deploy Node.js dan PM2 ke produksi:

  • [ ] Node.js diinstal via NodeSource (server) atau NVM (pengembangan) — bukan paket universe Ubuntu
  • [ ] PM2 diinstal secara global dengan izin yang benar untuk metode instalasi Anda
  • [ ] Aplikasi dimulai dengan flag `–name` dan ambang batas `–max-memory-restart` yang ditentukan
  • [ ] Mode cluster diaktifkan untuk server HTTP; mode fork digunakan untuk background worker
  • [ ] `pm2 startup` dijalankan dan perintah yang dihasilkan dijalankan dengan sudo
  • [ ] `pm2 save` dijalankan setelah semua proses dikonfigurasi
  • [ ] Modul rotasi log diinstal dan dikonfigurasi
  • [ ] Nginx atau Caddy dikonfigurasi sebagai reverse proxy dengan TLS
  • [ ] Aplikasi menangani `SIGINT` dengan baik untuk reload zero-downtime
  • [ ] Rahasia dikelola di luar `ecosystem.config.js`
  • [ ] Unit systemd PM2 diverifikasi dengan `systemctl status pm2-<username>`
  • [ ] Firewall memblokir akses langsung ke port Node.js dari internet publik

FAQ

Apa perbedaan antara mode fork dan mode cluster PM2?

Mode fork menelurkan aplikasi sebagai satu child process — satu instance, satu core CPU yang digunakan. Mode cluster menggunakan modul cluster native Node.js untuk menelurkan beberapa proses worker yang semuanya berbagi port TCP yang sama, memungkinkan pemanfaatan multi-core yang sesungguhnya dan reload zero-downtime. Gunakan mode cluster untuk server HTTP/HTTPS dan mode fork untuk worker, cron job, atau aplikasi yang mempertahankan state internal yang tidak kompatibel dengan berbagi multi-proses.

Mengapa PM2 tidak restart setelah reboot server meskipun saya sudah menjalankan `pm2 startup`?

Penyebab paling umum adalah `pm2 save` tidak dijalankan setelah mengonfigurasi proses, sehingga file dump kosong atau tidak ada. Penyebab paling umum kedua adalah ketidakcocokan path NVM: jika versi default NVM diubah setelah membuat skrip startup, unit systemd menunjuk ke binary yang tidak ada. Selesaikan ini dengan menjalankan `pm2 unstartup`, menetapkan default NVM yang benar, lalu menjalankan ulang `pm2 startup` dan `pm2 save`.

Bisakah PM2 mengelola proses non-Node.js?

Ya. PM2 dapat mengelola executable apa pun dengan menentukan interpreter. Misalnya: `pm2 start script.py –interpreter python3`. Ini membuat PM2 berguna sebagai process supervisor tujuan umum untuk arsitektur microservice multi-bahasa.

Bagaimana cara menjalankan beberapa aplikasi Node.js di port berbeda di belakang satu server?

Definisikan setiap aplikasi sebagai entri terpisah dalam `ecosystem.config.js` dengan variabel lingkungan `PORT` yang berbeda. Konfigurasikan Nginx sebagai reverse proxy dengan blok `server` terpisah atau direktif `location` yang merutekan ke setiap port. Semua aplikasi berbagi daemon PM2 yang sama dan dikelola melalui satu tampilan `pm2 list`.

Haruskah saya menggunakan NVM atau NodeSource untuk VPS produksi?

NodeSource umumnya lebih disukai untuk server produksi. NodeSource menginstal Node.js sebagai paket sistem, membuatnya tersedia untuk semua pengguna dan layanan sistem tanpa dependensi inisialisasi shell. Model aktivasi per-pengguna dan per-shell NVM memperkenalkan mode kegagalan yang halus dalam unit systemd, cron job, dan pipeline CI/CD yang berjalan di luar sesi shell interaktif. Simpan NVM untuk mesin pengembangan lokal di mana mengelola beberapa versi Node.js secara bersamaan adalah kebutuhan nyata.

15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai