Deploy Aplikasi Node.js Menggunakan PM2

Ridwan Fajar 28 September 2016

Deploy Aplikasi Node.js Menggunakan PM2

Salah satu kendala ketika seseorang baru belajar Node.js adalah berhasil membuat aplikasi namun bingung bagaimana membuatnya siap untuk dihidangkan kepada publik. Memang tidak mengherankan karena Node.js sendiri tidak memberikan tutorial resmi seputar cara deploy ke server live. Bahkan bila kita ngulik Express.js, web framework untuk Node.js, pun tidak akan menemukan tutorial yang membahas secara langsung mengenai cara deploy aplikasi tersebut. Beberapa web framework lain mungkin memberikan panduan untuk memberikan cara deploy namun tidak semua orang tahu dan mau membaca dokumentasi tersebut. Berbeda dengan PHP yang dapat ditonggak oleh Apache atau Nginx. Atau Python yang dapat ditopang oleh Supervisor, Gunicorn, Nginx. Atau Java yang ditopang dengan menggunakan Apache Tomcat. Node.js memiliki beberapa alat yang dapat membantu kita untuk menjalankannya sebagai daemon di server linux. Di antara alat tersebut, PM2 muncul karena telah digunakan oleh beberapa enterprise seperti PayPal, Intuit, dan Viadeo. PM2 kini didanai oleh Keymetrics untuk mendukung pengembangan PM2. Selain dapat melakukan monitoring, PM2 dapat mengelola beberapa aplikasi kita dan memantaunya dengan baik dengan perintah - perintah yang mempermudah hidup kita. Tidak hanya itu, kita pun dapat menggunakan REST API yang disediakan PM2 untuk mengintegrasikan monitoring ke aplikasi web kita yang lain atau aplikasi mobile yang kita kembangkan untuk mengawasi aplikasi Node.js kita. Beberapa fitur utama yang disediakan PM2 antara lain:

  • Konfigurasi tingkah laku (behavior)
  • Kompatibel dengan PaaS
  • Watch dan reload
  • Manajemen log
  • Monitoring
  • Module system
  • Max memory reload
  • Cluster mode
  • Hot reload
  • Integrasi dengan Keymetrics
  • Development dan Deployment workflow
Untuk melihat demo singkatnya bagaimana menggunakan PM2, mari ikuti terus tutorial ini.

Persiapan Demo

Sebelum mengikuti tutorial ini, Anda wajib mencari tutorial cara instalasi Node.js dan NPM terlebih dahulu. Node.js sendiri digunakan untuk menjalankan script Node.js, sedangkan NPM adalah sebuah package manager yang akan membantu kita memasang library tambahan Node.js. Bila kita mengetahui Composer di PHP atau PIP di Python, NPM tidak jauh berbeda. Kemudian yang kita butuhkan lagi adalah koneksi internet, karena NPM membutuhkan koneksi internet untuk mengambil library yang kita butuhkan. Di demo ini kita akan membutuhkan Express.js dan PM2 itu sendiri. Sekarang mari kita install terlebih dahulu kedua modul tersebut:
$ npm install express
$ npm install pm2
Bila instalasi sudah selesai, Express.js dan PM2 dapat kita gunakan sebagai perintah di konsol. kita dapat memeriksanya dengan melakukan hal berikut:
$ express -V
4.13.1
$ pm2 -V
1.1.1
Sekarang kita memerlukan bahan percobaan dengan membuat sebuah proyek aplikasi web menggunakan Express.js. Pertama kita harus membuat proyek starter-nya dahulu baru kemudian memasang library yang dibutuhkan oleh aplikasi Express.js. Berikut adalah perintah untuk membuat aplikasi Express.js:
$ express myapp
$ cd myapp
$ npm install
lakukan sekali lagi untuk membuat aplikasi kedua yang akan menjadi bahan percobaan kita:
$ express another_myapp
$ cd another_myapp
$ npm install
Bila perintah sudah selesai dijalankan, maka di kedua folder proyek tersebut akan muncul sebuah folder bernama node_modules yang di dalamnya terdapat berbagai library yang dibutuhkan oleh proyek Express.js. Secara default, Express.js menjalankan aplikasinya di port 3000, sekarang kita harus merubah salah satu proyek tersebut untuk menjalankan aplikasi di port lain. Kita akan mengubah file www yang ada di folder another_myapp/bin. Silahkan ubah port-nya menjadi 3030 seperti pada source code berikut:
#!/usr/bin/env node

/**

  • Module dependencies. */

var app = require('../app'); var debug = require('debug')('another_myapp:server'); var http = require('http');

/**

  • Get port from environment and store in Express. */

var port = normalizePort(process.env.PORT || '3030'); app.set('port', port);

/**

  • Create HTTP server. */

var server = http.createServer(app);

............................................

Sekarang mari kita jalankan kedua proyek tersebut di konsol tanpa menggunakan PM2 terlebih dahulu:

$ cd myapp
$ npm start

> myapp@0.0.0 start /home/Projects/pm2-demo/myapp
> node ./bin/www

Jalankan juga proyek another_myapp:

$ cd another_myapp
$ npm start

> myapp@0.0.0 start /home/Projects/pm2-demo/another_myapp
> node ./bin/www

Kedua aplikasi sudah dapat berjalan dan diakses via web browser: Selection_005 Selection_006

Mencoba PM2 terhadap Aplikasi Node.js

Bila sebelumnya kita hanya menjalankannya secara manual untuk masing - masing proyek, sekarang kita akan coba langsung memasangnya di PM2. Bila kita masih menjalankan kedua aplikasi di konsol, silahkan matikan terlebih dahulu. Kemudian mari kita lihat, panduan quickstart apakah yang dapat digunakan untuk memulai penggunaan PM2: selection_013 selection_014

Seperti yang kita lihat, PM2 memiliki sejumlah perintah yang siap membantu kita sekaligus memberikan contoh penggunaan dasar dengan menggunakan PM2. Sekarang mari kita lihat apakah ada aplikasi yang berjalan diatas PM2 atau tidak:

selection_015

Ternyata saat ini belum ada satu pun aplikasi yang telah dipasang di PM2. Sekarang kita akan menggunakan perintah start untuk menjalankan myapp dan another_myapp diatas PM2. Berikut adalah perintah untuk menjalankan aplikasi Node.js diatas PM2:

selection_016

Kemudian jalankan juga another_myapp dengan perintah yang sama namun berbeda nama dan folder:

selection_017

Hasilnya, kita dapat melihat another_myapp telah ditambahkan ke dalam PM2. Mengapa file bin/www yang dijalankan? karena Express.js menyimpan objek dan konfigurasi utama server di dalam script tersebut. Bila kita memiliki sebuah script Node.js yang sudah berisi objek server, kita dapat langsung menjalankannya dengan PM2. Berikut adalah beberapa penjelasan dari setiap bagian kolom diatas:

  • App Name, nama aplikasi yang kita bubuhkan untuk aplikasi kita sendiri. Nama tersebut jadi pembeda untuk aplikasi Node.js lainnya
  • id, merupakan sebuah id yang diberikan oleh PM2
  • cluster, menjalankan aplikasi dalam cluster mode
  • pid, merupakan process id* yang dihasilkan oleh sistem operasi
  • status, keadaan dimana aplikasi kita masih berjalan atau tidak
  • restart, hitungan untuk melihat berapa kali aplikasi telah di-restart
  • uptime, hitungan untuk melihat berapa lama aplikasi kita telah dijalankan sejak awal running
  • memory, jumlah memori yang digunakan oleh process id
  • watching, keadaan dimana aplikasi kita dipantau perubahan file-nya atau tidak
Setelah menjalankan aplikasi Node.js diatas PM2, kita dapat mulai menyeduh kopi terlebih dahulu sebelum melakukan monitoring sederhana menggunakan perintah berikut:
$ pm2 monit
Maka kita akan disuguhkan sebuah tools yang memperlihatkan apakah aplikasi Node.js sedang menangani banyak request atau tidak. Selection_007

Untuk melihat monitoring tersebut berjalan atau tidak, kita dapat menggunakan Apache Benchmark untuk menghantam kedua aplikasi tersebut. Coba perhatikan perintah berikut ini:

$ ab -n 10000 -c 1000 http://localhost:3000/

Kemudian untuk menghantam aplikasi yang kedua gunakan juga perintah yang sama:

$ ab -n 10000 -c 1000 http://localhost:3030/

Sekarang kita dapat melihat "pm2 monit" bekerja membantu kita mengawasi request yang ditangani oleh aplikasi: pm2 monit Setelah melalui jalan yang cukup panjang, akhirnya kita dapat mengetahui beberapa perintah dasar di PM2. Mari kita lanjutkan melihat perintah lainnya.

Mengenal perintah - perintah dasar PM2

Salah satu kelebihan PM2 adalah memberikan informasi "perintah apalagi yang bisa digunakan" ketika sedang menjalankan perintah lain. Mirip seperti mengunjungi halaman blog, kita dapat melihat sebuah kolom yang menyarankan kita untuk melihat artikel lain. Misal ketika kita menjalankan perintah "pm2 list" dibawahnya akan muncul saran untuk menggunakan perintah lain. Sehingga kita mendapatkan bimbingan langsung dari PM2. Mari kita coba beberapa perintah tersebut dimulai dari perintah berikut:
selection_018
Bila kita mengganti 0 dengan nama "myapp" maka kita akan melihat semua process yang menjalankan aplikasi tersebut. Sekarang kita akan coba melihat log yang dihasilkan setiap process. Kita akan mencoba melihat log dari myapp:
$ pm2 logs myapp

[PM2] Tailing last 20 lines for [myapp] process

myapp-1 (out): GET / 200 9.420 ms - 170 myapp-1 (out): GET / 200 9.783 ms - 170 myapp-1 (out): GET / 200 10.573 ms - 170 myapp-1 (out): GET / 200 22.453 ms - 170

myapp-3 (out): GET / 200 8.032 ms - 170 myapp-3 (out): GET / 200 7.869 ms - 170 myapp-3 (out): GET / 200 7.815 ms - 170 myapp-3 (out): GET / 200 8.937 ms - 170

myapp-0 (out): GET / 200 7.886 ms - 170 myapp-0 (out): GET / 200 8.279 ms - 170 myapp-0 (out): GET / 200 8.138 ms - 170 myapp-0 (out): GET / 200 7.938 ms - 170

myapp-2 (out): GET / 200 8.120 ms - 170 myapp-2 (out): GET / 200 7.977 ms - 170 myapp-2 (out): GET / 200 8.156 ms - 170 myapp-2 (out): GET / 200 7.911 ms - 170

[PM2] Streaming realtime logs for [myapp] process

Ketika kita melihat log dari aplikasi yang dijalankan dengan PM2, maka kita akan melihatnya secara streaming yang dimana akan melihat log terus berjalan apabila ada request yang sedang ditangani. Coba perhatikan gambar berikut: pm2 log Sekarang bila Anda lupa mengingat process id dari aplikasi Anda, dapat menggunakan perintah berikut:

$ pm2 id myapp
[ 0, 1, 2, 3 ]
$ pm2 id another_myapp
[ 4, 5, 6, 7 ]

Sekarang kita akan mencoba me-restart myapp. Ketika proses restart selesai maka kita akan melihat hitungan restart bertambah satu kali yang asalnya telah di-restart satu kali:

selection_020

Sekarang mari kita coba hentikan aplikasi another_myapp:

selection_021

Lalu kita delete aplikasi another_myapp dari PM2:

selection_022

Sekarang aplikasi yang berjalan hanya tinggal myapp. Begitupun jika kita melihatnya di "pm2 monit" atau web browser, kita tidak akan dapat mengakses another_myapp karena sudah dimatikan. Selection_009 Selection_008

Melihat perintah PM2 lainnya

Disadur dari dokumentasi resminya, berikut adalah beberapa perintah PM2 yang wajib dicoba:
# Fork mode
$ pm2 start app.js --name my-api # Name process

Cluster mode

$ pm2 start app.js -i 0 # Will start maximum processes with LB depending on available CPUs $ pm2 start app.js -i max # Same as above, but deprecated yet.

Listing

$ pm2 list # Display all processes status $ pm2 jlist # Print process list in raw JSON $ pm2 prettylist # Print process list in beautified JSON

$ pm2 describe 0 # Display all informations about a specific process

$ pm2 monit # Monitor all processes

Logs

$ pm2 logs [--raw] # Display all processes logs in streaming $ pm2 flush # Empty all log file $ pm2 reloadLogs # Reload all logs

Actions

$ pm2 stop all # Stop all processes $ pm2 restart all # Restart all processes

$ pm2 reload all # Will 0s downtime reload (for NETWORKED apps) $ pm2 gracefulReload all # Send exit message then reload (for networked apps)

$ pm2 stop 0 # Stop specific process id $ pm2 restart 0 # Restart specific process id

$ pm2 delete 0 # Will remove process from pm2 list $ pm2 delete all # Will remove all processes from pm2 list

Misc

$ pm2 reset # Reset meta data (restarted time...) $ pm2 updatePM2 # Update in memory pm2 $ pm2 ping # Ensure pm2 daemon has been launched $ pm2 sendSignal SIGUSR2 my-app # Send system signal to script $ pm2 start app.js --no-daemon $ pm2 start app.js --no-vizion $ pm2 start app.js --no-autorestart

Kita pun dapat menjalankan REST service untuk mengakses data - data yang ada di PM2 untuk diintegrasikan dengan aplikasi web lainnya. Berikut adalah perintah untuk menjalankan http interface PM2:

selection_023

Kita dapat melihatnya di web browser yang menampilkan response berupa JSON. Response ini dapat kita parsing untuk diintegrasikan dengan aplikasi lain: Selection_010

Untuk melihat cara deploy yang lebih advance, kita dapat menggunakan perintah berikut:

selection_019

Penutup

PM2 memang praktis untuk digunakan, kita dapat menggunakannya dengan mudah sampai kita mempelajari konfigurasi terbaik untuk aplikasi Node.js kita. Codepolitan pun telah mencoba PM2 dengan disandingkan bersama sebuah engine notifikasi berbasis Node.js dan Socket.IO yang di-deploy di sebuah virtual machine Linux di Azure. Bagi Anda yang sudah punya virtual private server sendiri, PM2 sangat layak dicoba untuk aplikasi Node.js kita. (rfs/pm2/nodejs)