Deploy Aplikasi Node.js Menggunakan PM2
Ridwan Fajar 28 September 2016
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
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:
Sekarang mari kita jalankan kedua proyek tersebut di konsol tanpa menggunakan PM2 terlebih dahulu:#!/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);
............................................
$ 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:
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:
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:
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:
Kemudian jalankan juga another_myapp dengan perintah yang sama namun berbeda nama dan folder:
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
$ pm2 monit
Maka kita akan disuguhkan sebuah tools yang memperlihatkan apakah aplikasi Node.js sedang menangani banyak request atau tidak.
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: 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:
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:
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: Sekarang bila Anda lupa mengingat process id dari aplikasi Anda, dapat menggunakan perintah berikut:$ 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
$ 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:
Sekarang mari kita coba hentikan aplikasi another_myapp:
Lalu kita delete aplikasi another_myapp dari PM2:
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.
Melihat perintah PM2 lainnya
Disadur dari dokumentasi resminya, berikut adalah beberapa perintah PM2 yang wajib dicoba: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:# 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 dapat melihatnya di web browser yang menampilkan response berupa JSON. Response ini dapat kita parsing untuk diintegrasikan dengan aplikasi lain:
Untuk melihat cara deploy yang lebih advance, kita dapat menggunakan perintah berikut: