คำตอบสั้น ๆ: ติดตั้ง Node.js LTS รันแอปด้วย PM2 ให้เริ่มใหม่เองเมื่อแอปล่มหรือรีบูตเครื่อง และใช้ Nginx เป็น Reverse Proxy รับโดเมนจริงบนพอร์ต 80 และ 443
คู่มือนี้อธิบาย Nginx Reverse Proxy ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
แอป Node.js เช่น Express, Next.js หรือ NestJS ปกติจะฟังอยู่ที่พอร์ตสูงอย่าง 3000 การรันด้วย node app.js ตรง ๆ มีข้อเสียคือแอปจะหยุดเมื่อปิด SSH หรือเกิด Error และไม่เปิดเองหลังรีบูตเครื่อง PM2 เป็น Process Manager ที่แก้ปัญหาเหล่านี้ ส่วน Nginx ทำหน้าที่ Reverse Proxy รับคำขอจากโดเมนจริงที่พอร์ต 80 และ 443 แล้วส่งต่อให้แอป รวมถึงจัดการ SSL ได้
คู่มือนี้ใช้ Ubuntu 22.04 หรือ 24.04 เป็นหลัก และให้คำสั่งสำหรับ AlmaLinux หรือ Rocky Linux ในจุดที่ต่างกัน
สิ่งที่ต้องเตรียม (Nginx Reverse Proxy)
- ผู้ใช้ทั่วไปที่มีสิทธิ์
sudoไม่ควรรันแอปด้วย root (ดู สร้างผู้ใช้ใหม่และให้สิทธิ์ sudo บน Linux) - Nginx ติดตั้งแล้ว (
sudo apt install -y nginxหรือsudo dnf install -y nginx) - โดเมนที่ชี้ A Record มายังเซิร์ฟเวอร์ และพอร์ต 80/443 เปิดแล้ว
ขั้นตอนที่ 1: ติดตั้ง Node.js เวอร์ชัน LTS (Nginx Reverse Proxy)
แพ็กเกจ nodejs ที่มากับ Ubuntu มักเป็นเวอร์ชันเก่า แนะนำให้ติดตั้งจาก Repository ของ NodeSource ตัวอย่างนี้ใช้ Node.js 24 ซึ่งเป็น LTS ในขณะที่เขียน ตรวจเวอร์ชัน LTS ล่าสุดได้ที่ nodejs.org แล้วเปลี่ยนตัวเลขในคำสั่งให้ตรง
Ubuntu
curl -fsSL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt-get install -y nodejsAlmaLinux และ Rocky Linux
curl -fsSL https://rpm.nodesource.com/setup_24.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo dnf install -y nodejsตรวจสอบเวอร์ชัน
node -v
npm -vขั้นตอนที่ 2: เตรียมแอปตัวอย่าง (Nginx Reverse Proxy)
หากมีแอปอยู่แล้วให้ข้ามไปขั้นตอนที่ 3 ได้ สิ่งสำคัญคือแอปควรฟังที่ 127.0.0.1 ไม่ใช่ทุก Interface เพื่อให้เข้าถึงได้ผ่าน Nginx เท่านั้น
mkdir -p ~/apps/myapp && cd ~/apps/myapp
nano app.jsconst http = require('http');
const PORT = process.env.PORT || 3000;
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('Hello from Node.js\n');
}).listen(PORT, '127.0.0.1', () => {
console.log(`Listening on 127.0.0.1:${PORT}`);
});ขั้นตอนที่ 3: ติดตั้ง PM2 และรันแอป
sudo npm install -g pm2
pm2 start app.js --name myapp
pm2 statusตาราง pm2 status ควรแสดงแอปชื่อ myapp สถานะ online สำหรับแอปที่เริ่มด้วย npm start ใช้ pm2 start npm --name myapp -- start แทน
ตั้งให้ PM2 เปิดเองเมื่อบูตเครื่อง โดยรันคำสั่งนี้ด้วยผู้ใช้ที่รันแอป (ไม่ใช่ root)
pm2 startup systemdPM2 จะพิมพ์คำสั่งที่ขึ้นต้นด้วย sudo env PATH=... ออกมาหนึ่งบรรทัด ให้คัดลอกบรรทัดนั้นไปรันตามที่แสดง จากนั้นบันทึกรายการแอปที่กำลังรันอยู่
pm2 saveทุกครั้งที่เพิ่มหรือลบแอปใน PM2 ต้องรัน pm2 save อีกครั้ง ไม่เช่นนั้นหลังรีบูตจะได้รายการเดิม
คำสั่งที่ใช้บ่อย
| คำสั่ง | หน้าที่ |
|---|---|
pm2 logs myapp | ดู Log ของแอป |
pm2 restart myapp | รีสตาร์ตแอปหลังอัปเดตโค้ด |
pm2 reload myapp | รีโหลดแบบไม่ขาดช่วง (ใช้ได้กับโหมด cluster) |
pm2 monit | ดู CPU และ RAM ของแต่ละแอปแบบเรียลไทม์ |