หลายคนที่เคย deploy ระบบอาจเคยเจอปัญหาเซิร์ฟล่ม แอปหยุดทำงานโดยไม่สามารถ restart ได้เอง พอจะ debug ก็เจอกับการจัดการ logs ที่ไม่เป็นระเบียบทำให้หาสาเหตุยาก หรือบางครั้งก็รู้สึกว่าเครื่องทำงานไม่เต็มที่ เพราะโปรแกรมรันอยู่แค่ single thread ซึ่งแปลว่าเราไม่ได้ใช้ทรัพยากรทั้งหมดที่มี ยิ่งไปกว่านั้น เมื่อถึงเวลาต้องอัพเดทโค้ดใหม่ ก็กลายเป็นว่าต้องหยุดระบบ (downtime) โดยไม่จำเป็น หรืออาจเจอปัญหาที่ไม่รู้ตัวเพราะขาดการ monitor performance อย่างเหมาะสม
ในบทความนี้ เราจะพามาทำความรู้จักกับ PM2 เครื่องมือเด็ดที่จะช่วยให้การ deploy แอปของคุณกลายเป็นเรื่องง่ายและเร็วขึ้นในทุกขั้นตอน
รู้จักกับ PM2
PM2 คือ Advanced Production Process Manager ที่ทำหน้าที่เป็น daemon process manager ช่วยจัดการและทำให้แอปพลิเคชันของคุณสามารถทำงานได้ตลอด 24/7 ตามที่ในเว็บของ PM2 ได้แนะนำตัวเองเอาไว้
ฟีเจอร์ที่น่าสนใจ
- Cluster Mode ทำงานแบบ multiple processes โดยใช้ทุก CPU cores ที่มี ช่วยเพิ่มประสิทธิภาพและความเสถียรของแอพ
- Hot Reload & Zero Downtime อัพเดทแอพโดยไม่มี downtime ผู้ใช้สามารถใช้งานได้ต่อเนื่องแม้ขณะ deploy โค้ดใหม่
- Auto Restart & Max Memory รีสตาร์ทอัตโนมัติเมื่อแอพล่มหรือใช้ memory เกินที่กำหนด ช่วยให้แอพทำงานได้ตลอด 24/7
- Built-in Load Balancer กระจาย load ระหว่าง processes อัตโนมัติ ทำให้รองรับผู้ใช้จำนวนมากได้อย่างมีประสิทธิภาพ
- Real-time Monitoring ดู metrics สำคัญแบบ real-time เช่น CPU, Memory, HTTP requests ช่วยให้จัดการปัญหาได้ทันท่วงที
PM2 ใช้กับอะไรได้บ้าง
ตัว PM2 เองทำงานเป็น Process Manager เพราะฉะนั้นมันสามารถเอาไปรันได้หลากหลายมาก แค่จากในเว็บที่มีตัวอย่างคำสั่งก็ได้ตั้งแต่ Node, Bash Script, Python ไปจนถึง Binary File ตามคำสั่งตัวอย่างนี้เลย
$ pm2 start app.js
$ pm2 start bashscript.sh
$ pm2 start python-app.py --watch
$ pm2 start binary-file -- --port 1520
ลองใช้แบบไว ๆ
สมมติว่าเรามีโค้ด app.js หน้าตาแบบนี้
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello");
});
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
JavaScriptติดตั้ง PM2 ก็ทำผ่าน npm ได้เลย
npm install -g pm2@latest
Bashสั่งรัน
pm2 start app.js
Bashก็จะโชว์ว่าตอนนี้รัน app.js ของเราเรียบร้อย
เรียก API ได้เหมือนรันด้วย node แบบปกติเลย
ใช้แทน Docker ได้รึเปล่า ?
สำหรับการ deploy แอปพลิเคชันใน production environment หลายคนอาจสงสัยว่า PM2 จะสามารถใช้แทน Docker ได้หรือไม่ ต้องเข้าใจว่า PM2 และ Docker นั้นมีบทบาทที่ต่างกันในภาพรวมของการจัดการแอปพลิเคชัน แม้ว่า PM2 จะจัดการเรื่องการ deploy และ monitor application ได้ดี โดยเฉพาะในส่วนของการจัดการ process การทำ load balancing และการ restart แอปอัตโนมัติ แต่ Docker นั้นถูกออกแบบมาเพื่อทำหน้าที่เป็น containerization solution ซึ่งมีจุดประสงค์หลักในการแยก environment ระหว่างแอปพลิเคชันและระบบปฏิบัติการ
Docker จะเหมาะสำหรับการจัดการ dependencies และ environment isolation อย่างสมบูรณ์ ทำให้แอปพลิเคชันทำงานได้อย่างอิสระโดยไม่ต้องกังวลเรื่องการชนกันของ dependencies ในหลายกรณี การใช้ Docker ร่วมกับ PM2 ก็เป็นตัวเลือกนึงที่สามารถนำมาใช้ได้ โดย PM2 ทำหน้าที่จัดการ process ใน container ของ Docker ช่วยเพิ่มประสิทธิภาพและความยืดหยุ่นให้กับระบบ
สรุป
PM2 เป็นเครื่องมือที่ทรงพลังสำหรับการ deploy Node.js applications ช่วยให้การจัดการ process ทำได้ง่าย มี features ครบครันสำหรับ production และช่วยให้แอปพลิเคชันทำงานได้อย่างมีประสิทธิภาพ เหมาะสำหรับทั้งโปรเจกต์ขนาดเล็กและขนาดใหญ่