คำตอบสั้น ๆ: เปิดใช้ Node.js ให้โดเมนใน Plesk กำหนด Application Root และ Startup File ติดตั้ง Package ด้วย npm และรีสตาร์ตแอปได้เองโดยไม่ต้องตั้ง Reverse Proxy
คู่มือนี้อธิบาย Plesk ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Plesk Obsidian รองรับการรันแอป Node.js ผ่านส่วนขยาย Node.js ซึ่งทำงานร่วมกับ Phusion Passenger เบื้องหลัง Web Server ของ Plesk ทำให้คุณรันแอปอย่าง Express, Fastify หรือ API ขนาดเล็กบนโดเมนได้โดยไม่ต้องตั้ง PM2 หรือ Reverse Proxy เอง Passenger จะเป็นผู้เริ่มแอป ส่งต่อ Request จาก Apache หรือ Nginx เข้าไป และเริ่มแอปใหม่ให้อัตโนมัติเมื่อ Process หยุดทำงาน
คู่มือนี้เหมาะกับเว็บไซต์หรือ API ที่รันต่อเนื่องบน Hosting แบบ Plesk หากคุณมี Cloud Server ที่ดูแลเองทั้งเครื่องและต้องการควบคุม Process เต็มที่ ดูอีกแนวทางได้ที่ รันแอป Node.js ด้วย PM2 และ Nginx Reverse Proxy
สิ่งที่ต้องเตรียม
- บัญชี Plesk ที่มีเมนู Node.js ในหน้าโดเมน (ผู้ดูแลเซิร์ฟเวอร์ต้องติดตั้งส่วนขยาย Node.js และเวอร์ชัน Node.js ที่ต้องการไว้แล้ว หากไม่เห็นเมนูนี้ ให้ติดต่อผู้ดูแลเซิร์ฟเวอร์)
- โดเมนหรือ Subdomain ที่ชี้มายังเซิร์ฟเวอร์แล้ว แนะนำให้ใช้ Subdomain แยก เช่น
api.example.comถ้าโดเมนหลักรันเว็บ PHP อยู่ - ซอร์สโค้ดแอปที่มีไฟล์
package.jsonและไฟล์เริ่มต้น เช่นapp.js - ช่องทางอัปโหลดไฟล์ เช่น File Manager, FTP หรือ Git (ดู Deploy เว็บไซต์จาก Git Repository บน Plesk)
ขั้นตอนที่ 1: เตรียมโค้ดให้รับพอร์ตจาก Passenger
จุดที่ต้องแก้บ่อยที่สุดคือพอร์ต แอปบน Plesk ไม่ได้เปิดพอร์ต 3000 ให้คนภายนอกเข้าโดยตรง Passenger จะกำหนดพอร์ตหรือ Socket ให้ผ่านตัวแปร PORT แอปจึงต้องอ่านค่าจาก process.env.PORT ตัวอย่างไฟล์ app.js แบบ Express
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello from Plesk');
});
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log('Listening on ' + port);
});
ค่า || 3000 ใช้สำหรับทดสอบบนเครื่องของคุณเอง เมื่อรันบน Plesk ค่าจาก PORT จะถูกใช้แทนเสมอ
หากโปรเจกต์เป็น ES Module (มี "type": "module" ใน package.json) และ Passenger เวอร์ชันบนเซิร์ฟเวอร์เริ่มแอปไม่ได้ ให้สร้างไฟล์เริ่มต้นแยกชื่อ app.cjs ที่มีบรรทัดเดียวคือ import('./app.js'); แล้วตั้งไฟล์นี้เป็น Startup File แทน
ขั้นตอนที่ 2: อัปโหลดโค้ดและจัดโครงสร้างโฟลเดอร์
โครงสร้างที่แนะนำคือแยก Application Root ออกจาก Document Root เพื่อไม่ให้ไฟล์อย่าง package.json หรือ .env ถูกเรียกดูจากเว็บได้
/httpdocs/api-app/ <- Application Root
/httpdocs/api-app/app.js <- Application Startup File
/httpdocs/api-app/package.json
/httpdocs/api-app/public/ <- Document Root (ไฟล์ Static)
อัปโหลดไฟล์ทั้งหมดยกเว้นโฟลเดอร์ node_modules เพราะเราจะติดตั้ง Package บนเซิร์ฟเวอร์ในขั้นตอนถัดไป Package ที่มี Native Module ซึ่งคอมไพล์บน Windows หรือ macOS มักใช้บน Linux ไม่ได้
ขั้นตอนที่ 3: เปิดใช้ Node.js ให้โดเมน
- เข้า Plesk ไปที่ Websites & Domains แล้วเลือกโดเมนที่ต้องการ
- คลิก Node.js (ในแท็บ Dashboard ของโดเมน)
- คลิก Enable Node.js
- ตั้งค่าตามตารางด้านล่าง ค่าที่แก้แล้วจะบันทึกทันทีเมื่อกดยืนยันที่ช่องนั้น
| ช่อง | ความหมาย | ตัวอย่าง |
|---|---|---|
| Node.js Version | เวอร์ชัน Node.js ที่ใช้รันแอป เลือกให้ตรงกับที่ทดสอบไว้ (ควรเป็นรุ่น LTS) | 20.x หรือ 22.x |
| Package Manager | ตัวติดตั้ง Package | npm หรือ yarn |
| Document Root | โฟลเดอร์ไฟล์ Static ที่ Web Server เสิร์ฟได้เอง | /httpdocs/api-app/public |
| Application Mode | ค่า NODE_ENV ที่ส่งให้แอป | production |
| Application Root | โฟลเดอร์ที่มี package.json | /httpdocs/api-app |
| Application Startup File | ไฟล์ที่ Passenger ใช้เริ่มแอป | app.js |
| Custom environment variables | ตัวแปรสำหรับแอป เช่น ค่าเชื่อมต่อฐานข้อมูล | DB_HOST=localhost |
หมายเหตุ: ป้ายชื่อและตำแหน่งปุ่มอาจต่างเล็กน้อยตามเวอร์ชันของส่วนขยาย Node.js ใน Plesk แต่ชื่อช่องหลักด้านบนมีในทุกรุ่นที่ยังได้รับการสนับสนุน