รันแอป 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 ให้โดเมน
- เข้า 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 แต่ชื่อช่องหลักด้านบนมีในทุกรุ่นที่ยังได้รับการสนับสนุน
ขั้นตอนที่ 4: ติดตั้ง Package และสั่งรันแอป
- ในหน้า Node.js ของโดเมน คลิก NPM install (หรือ Yarn install ถ้าเลือก yarn) ระบบจะอ่าน
package.jsonแล้วติดตั้งลงโฟลเดอร์node_modulesใน Application Root - หากแอปต้อง Build ก่อนรัน เช่น TypeScript หรือ Frontend Bundle ให้คลิก Run script แล้วพิมพ์ชื่อสคริปต์จาก
package.jsonเช่นbuild - คลิก 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 ที่เห็น เพื่อให้ทีมงานตรวจสอบได้เร็วขึ้น
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี


