ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home รันแอป Node.js บน Plesk

รันแอป Node.js บน 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 ให้โดเมน

  1. เข้า Plesk ไปที่ Websites & Domains แล้วเลือกโดเมนที่ต้องการ
  2. คลิก Node.js (ในแท็บ Dashboard ของโดเมน)
  3. คลิก Enable Node.js
  4. ตั้งค่าตามตารางด้านล่าง ค่าที่แก้แล้วจะบันทึกทันทีเมื่อกดยืนยันที่ช่องนั้น
ช่องความหมายตัวอย่าง
Node.js Versionเวอร์ชัน Node.js ที่ใช้รันแอป เลือกให้ตรงกับที่ทดสอบไว้ (ควรเป็นรุ่น LTS)20.x หรือ 22.x
Package Managerตัวติดตั้ง Packagenpm หรือ 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 แต่ชื่อช่องหลักด้านบนมีในทุกรุ่นที่ยังได้รับการสนับสนุน

ขั้นตอนที่ 4: ติดตั้ง Package และสั่งรันแอป

  1. ในหน้า Node.js ของโดเมน คลิก NPM install (หรือ Yarn install ถ้าเลือก yarn) ระบบจะอ่าน package.json แล้วติดตั้งลงโฟลเดอร์ node_modules ใน Application Root
  2. หากแอปต้อง Build ก่อนรัน เช่น TypeScript หรือ Frontend Bundle ให้คลิก Run script แล้วพิมพ์ชื่อสคริปต์จาก package.json เช่น build
  3. คลิก Restart App เพื่อให้ Passenger โหลดโค้ดชุดใหม่

ถ้าบัญชีของคุณมีสิทธิ์ SSH ก็สั่งงานจาก Command Line ได้เช่นกัน Node.js ของ Plesk ติดตั้งอยู่ใต้ /opt/plesk/node/ แยกตามเวอร์ชัน ตัวอย่างสำหรับ Node.js 20

cd ~/httpdocs/api-app
/opt/plesk/node/20/bin/npm install --omit=dev

หลังแก้โค้ดผ่าน SSH ให้บอก Passenger ให้เริ่มแอปใหม่ด้วยการสร้างไฟล์ tmp/restart.txt ใน Application Root หรือกด Restart App ในหน้า Plesk

mkdir -p ~/httpdocs/api-app/tmp
touch ~/httpdocs/api-app/tmp/restart.txt

ขั้นตอนที่ 5: ใส่ค่า Environment อย่างปลอดภัย

อย่าเก็บรหัสผ่านฐานข้อมูลหรือ API Key ไว้ในโค้ดที่ส่งขึ้น Git ให้กรอกใน Custom environment variables ทีละคู่ เช่น DB_USER และ DB_PASSWORD แล้วอ่านในโค้ดด้วย process.env.DB_PASSWORD ทุกครั้งที่เปลี่ยนค่าเหล่านี้ต้องกด Restart App ค่าใหม่จึงจะมีผล ส่วนการสร้างฐานข้อมูลดูได้ที่ สร้างฐานข้อมูลและผู้ใช้ฐานข้อมูลบน Plesk

ตรวจสอบผลลัพธ์

  • เปิด https://api.example.com/ ในเบราว์เซอร์ ควรเห็นข้อความจากแอป เช่น Hello from Plesk
  • ตรวจจาก Command Line ด้วย curl -I https://api.example.com/ ควรได้ HTTP/2 200 หรือ HTTP/1.1 200 OK
  • ไฟล์ใน Document Root เช่น public/logo.png ควรเปิดได้ที่ https://api.example.com/logo.png โดยไม่ผ่านโค้ด Node.js
  • เปิดโดเมนให้ใช้ HTTPS ด้วย ดูที่ บังคับเว็บไซต์ให้ใช้ HTTPS บน Plesk

ปัญหาที่พบบ่อย

หน้าเว็บขึ้น "Web application could not be started"

Passenger เริ่มแอปไม่สำเร็จ สาเหตุหลักคือ Startup File ผิดชื่อ ยังไม่ได้กด NPM install หรือโค้ด Error ตอนเริ่ม ให้เปลี่ยน Application Mode เป็น development ชั่วคราวแล้ว Restart App หน้า Error จะแสดงรายละเอียด เช่น Cannot find module 'express' เมื่อแก้เสร็จอย่าลืมเปลี่ยนกลับเป็น production เพราะหน้า Error แบบละเอียดเปิดเผยข้อมูลภายใน ดู Log เพิ่มเติมได้ที่ ดู Log เว็บไซต์บน Plesk

แอปรันได้แต่เห็นหน้าเว็บเก่าหรือหน้า Default ของ Plesk

มักเกิดจากมีไฟล์ index.html หรือ index.php อยู่ใน Document Root ซึ่ง Web Server เสิร์ฟก่อนถึงแอป ให้ย้ายไฟล์เหล่านั้นออก หรือตั้ง Document Root ให้เป็นโฟลเดอร์ที่มีเฉพาะไฟล์ Static จริง

แก้โค้ดแล้วผลไม่เปลี่ยน

Passenger เก็บ Process เดิมไว้ในหน่วยความจำ ต้องกด Restart App หรือ touch tmp/restart.txt ทุกครั้งหลังอัปโหลดโค้ดใหม่

แอปเขียนให้ Listen พอร์ต 3000 ตายตัว

แอปอาจเริ่มได้แต่ Passenger ส่ง Request เข้าไม่ถึง ให้แก้เป็น process.env.PORT ตามขั้นตอนที่ 1 และไม่ต้องเปิดพอร์ต 3000 ใน Firewall เพราะภายนอกเข้าผ่านพอร์ต 80 และ 443 ของ Web Server อยู่แล้ว

หากทำตามขั้นตอนแล้วยังติดปัญหา ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อโดเมน สิ่งที่ทำไปแล้ว และข้อความ Error ที่เห็น เพื่อให้ทีมงานตรวจสอบได้เร็วขึ้น

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security