ติดตั้ง MongoDB บน VPS Ubuntu — ฐานข้อมูล NoSQL เริ่มต้น

หากคุณกำลังหาฐานข้อมูลที่ เก็บข้อมูลแบบ Document (JSON) ปรับ Schema ได้ง่าย และเหมาะกับแอปสมัยใหม่อย่าง Node.js, Realtime app, IoT — MongoDB คือ NoSQL ที่ได้รับความนิยมที่สุดในโลก ใช้กับ Discord, eBay, Adobe

บทความนี้พาคุณติดตั้ง MongoDB Community Edition บน VPS Ubuntu 22.04 ตั้งแต่เพิ่ม Repository, สร้าง User, ตั้ง Authentication, ไปจนถึงเปิดให้แอปภายนอกเชื่อมต่อ พร้อมคำสั่ง mongosh ที่ต้องรู้

ต้องเตรียม: VPS Ubuntu 22.04 (RAM 2GB ขึ้นไป — MongoDB กิน RAM กว่า MySQL/PostgreSQL), Sudo access, เปิด Port 22 สำหรับ SSH

MongoDB คืออะไร — Document Database ทำงานอย่างไร

MongoDB เก็บข้อมูลในรูปแบบ BSON (Binary JSON) แต่ละ record เรียกว่า "Document" และ Document ถูกจัดเก็บใน "Collection" (เทียบเท่ากับ Table ใน SQL) แต่ละ Document ไม่จำเป็นต้องมีโครงสร้างเหมือนกัน ทำให้ปรับ Schema ได้ทันทีโดยไม่ต้อง ALTER TABLE

MongoDB vs MySQL — เลือกอันไหน

หัวข้อMongoDBMySQL
โครงสร้างDocument (BSON / JSON)Table (Row/Column)
SchemaFlexible — เพิ่ม field ได้ทันทีFixed — ต้อง ALTER TABLE
QueryJSON-like query (find, aggregate)SQL standard
Transactionรองรับตั้งแต่ v4.0 (multi-doc)InnoDB เต็มรูปแบบ
เหมาะกับแอป Realtime, Content, IoT, แอป Mobileเว็บทั่วไป, ERP, ระบบบัญชี

ขั้นที่ 1 — เพิ่ม MongoDB Official Repository

Ubuntu repository มี MongoDB เวอร์ชันเก่า — ใช้ official repo จะได้ v7.0 ล่าสุด เริ่มจาก import GPG key ของ MongoDB:

sudo apt update && sudo apt install -y gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

เพิ่ม source list ของ MongoDB 7.0 สำหรับ Ubuntu 22.04 (Jammy):

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

ขั้นที่ 2 — ติดตั้งและเริ่มต้น MongoDB

sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongod

ถ้า status เป็น active (running) แปลว่าติดตั้งสำเร็จ ทดสอบเชื่อมต่อด้วย mongosh:

mongosh

เมื่อเห็น prompt test> แสดงว่าเข้ามาที่ MongoDB Shell แล้ว ลองดู database:

show dbs

ขั้นที่ 3 — เปิด Authentication (สำคัญมาก)

โดย default MongoDB ไม่มี password — ต้องเปิด Authentication ก่อนใช้งานโปรดักชัน เริ่มจากสร้าง admin user:

mongosh
use admin
db.createUser({
  user: "adminUser",
  pwd: "StrongAdminPassword!",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})
exit

เปิด config ของ MongoDB:

sudo nano /etc/mongod.conf

หา section security (หรือเพิ่มใหม่) แล้วใส่:

security:
  authorization: enabled

Restart ให้ค่ามีผล:

sudo systemctl restart mongod

ทดสอบเข้าใหม่ด้วย user/password ที่สร้าง:

mongosh -u adminUser -p --authenticationDatabase admin

ขั้นที่ 4 — สร้าง Database และ User สำหรับแอป

ไม่ควรใช้ admin user ในแอป — สร้าง user เฉพาะแยกตาม database:

use myapp_db
db.createUser({
  user: "myapp",
  pwd: "AppPassword123!",
  roles: [ { role: "readWrite", db: "myapp_db" } ]
})

ทดสอบ Login:

mongosh -u myapp -p --authenticationDatabase myapp_db myapp_db

ขั้นที่ 5 — เปิดให้แอปภายนอกเชื่อมต่อ

โดย default MongoDB bind เฉพาะ 127.0.0.1 ถ้าต้องการให้แอปบนเครื่องอื่นเชื่อม ต้องแก้ bindIp ใน /etc/mongod.conf:

net:
  port: 27017
  bindIp: 0.0.0.0   # รับทุก interface — ระวัง! ต้องคู่กับ firewall

⚠️ อันตราย: bindIp: 0.0.0.0 เปิดให้ทุก IP บนอินเทอร์เน็ตเชื่อมต่อได้ — ต้องเปิด Firewall จำกัด IP เสมอ และต้องเปิด Authentication ใน ขั้นที่ 3 ก่อน

ตั้ง UFW อนุญาตเฉพาะ IP ของแอป:

sudo ufw allow from YOUR_APP_IP to any port 27017

ขั้นที่ 6 — Backup ด้วย mongodump

MongoDB มาพร้อมเครื่องมือ mongodump สำหรับสำรองข้อมูล:

mongodump --uri="mongodb://myapp:[email protected]:27017/myapp_db" \
  --out=/backup/mongo_$(date +%F)

คืนค่าจาก backup:

mongorestore --uri="mongodb://myapp:[email protected]:27017/myapp_db" \
  --drop /backup/mongo_2026-05-15/myapp_db

เคล็ดลับ: ตั้ง cron job รัน mongodump ทุกตี 3 แล้วใช้ rclone ส่งขึ้น S3 / Google Drive จะปลอดภัยกว่าเก็บไว้เครื่องเดียว

ปรับจูน MongoDB บน Ubuntu VPS ให้พร้อมโปรดักชัน

หลังติดตั้งและเปิด Authentication เรียบร้อยแล้ว ยังมีอีกหลายจุดที่ควรตั้งค่าก่อนปล่อยให้แอปจริงใช้งานบน VPS โดยเฉพาะเรื่อง WiredTiger cache, disk, swap และ log เพราะ MongoDB เป็นบริการที่กิน RAM มากกว่าฐานข้อมูล SQL ทั่วไป ถ้าตั้งค่าผิดอาจทำให้ระบบ OOM (Out Of Memory) แล้ว mongod ถูก kernel kill กลางคัน

โดย default MongoDB จะใช้ WiredTiger cache เท่ากับ 50% ของ RAM ลบ 1GB บน VPS ขนาดเล็กที่แชร์ RAM กับ Nginx, PHP-FPM หรือ Node.js ควรกำหนดเพดาน cache เองเพื่อกันไม่ให้ MongoDB กิน RAM จนบริการอื่นล่ม เปิด /etc/mongod.conf แล้วเพิ่มใน section storage:

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1.0   # จำกัด cache ที่ 1GB สำหรับ VPS RAM 2GB

VPS RAM น้อยควรเพิ่ม swap กันพังเวลามี query หนัก และปิด Transparent Huge Pages (THP) ตามคำแนะนำของ MongoDB เพราะ THP ทำให้ latency แกว่ง:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

เคล็ดลับ: ดู RAM ที่ MongoDB ใช้จริงด้วย db.serverStatus().wiredTiger.cache ใน mongosh หรือดูภาพรวมระบบด้วย htop ถ้า cache เต็มบ่อยให้พิจารณาอัปเกรด RAM ของ VPS

สร้าง Index เพื่อให้ Query เร็วขึ้น

เหมือน SQL — ถ้า Collection มี Document จำนวนมากแต่ไม่มี Index คำสั่ง find() จะทำ Collection Scan อ่านทุก Document ทำให้ช้าลงเรื่อย ๆ เมื่อข้อมูลโต ตรวจว่า query ไหนช้าด้วย explain():

db.users.find({ email: "[email protected]" }).explain("executionStats")

ถ้าเห็น COLLSCAN แปลว่ายังไม่มี Index ที่ field นั้น สร้าง Index เพิ่ม:

db.users.createIndex({ email: 1 }, { unique: true })
db.orders.createIndex({ userId: 1, createdAt: -1 })   # compound index
db.users.getIndexes()                                 # ดู index ทั้งหมด

กฎทอง: สร้าง Index เฉพาะ field ที่ใช้ใน query/sort บ่อย ๆ เท่านั้น — Index ทุกตัวกิน disk และทำให้การ insert/update ช้าลงเล็กน้อย อย่าสร้างเผื่อไว้ทุก field

ตรวจสุขภาพและดู Log ของ MongoDB

เมื่อปล่อยให้แอปจริงใช้งานบน VPS แล้ว ควรเฝ้าดูสถานะของ MongoDB เป็นระยะ เพราะปัญหาส่วนใหญ่ เช่น connection เต็ม, query ช้า, หรือ disk ใกล้เต็ม จะมีสัญญาณเตือนใน log ก่อนที่ระบบจะล่มจริง ดู log ของ MongoDB ที่ทำงานผ่าน systemd ได้ทันทีด้วย:

sudo systemctl status mongod
sudo journalctl -u mongod -n 50 --no-pager
sudo tail -f /var/log/mongodb/mongod.log

ภายใน mongosh มีคำสั่งดูสถานะแบบ realtime ที่ใช้บ่อยเวลามีปัญหา เช่น ดูจำนวน connection ปัจจุบัน, operation ที่กำลังรัน และสถิติของแต่ละ database:

db.serverStatus().connections   # จำนวน connection ที่เปิดอยู่
db.currentOp()                  # operation ที่กำลังทำงาน
db.stats()                      # ขนาด database + จำนวน document

ถ้าเจอ query ที่ช้าผิดปกติ เปิด Database Profiler เพื่อบันทึก operation ที่ใช้เวลานานเกินเกณฑ์ (เช่น 100 มิลลิวินาที) แล้วค่อยไปวิเคราะห์ทีหลังว่าควรเพิ่ม Index ตรงไหน:

db.setProfilingLevel(1, { slowms: 100 })
db.system.profile.find().sort({ ts: -1 }).limit(5)

ระวัง disk เต็ม: MongoDB ใช้ disk มากกว่า MySQL และ log file โตได้เรื่อย ๆ — ตรวจ df -h สม่ำเสมอ และตั้ง log rotation ผ่าน logRotate ใน config เพราะถ้า disk เต็ม mongod จะหยุดเขียนและบริการล่มทันที

เมื่อไหร่ควรใช้ MongoDB และเมื่อไหร่ควรใช้ SQL

MongoDB ไม่ได้เหนือกว่า MySQL/PostgreSQL ในทุกสถานการณ์ — แต่ละแบบเหมาะกับงานคนละลักษณะ การเลือกผิดตั้งแต่ต้นทำให้ต้องเขียนโค้ดอ้อมหรือย้ายฐานข้อมูลทีหลังซึ่งเจ็บปวดมาก ลองพิจารณาจากลักษณะข้อมูลและ pattern การ query ของแอปคุณ

เหมาะกับ MongoDB

เหมาะกับ SQL (MySQL / PostgreSQL)

ในทางปฏิบัติ: หลายระบบใช้ทั้งสองอย่างพร้อมกัน — SQL เก็บข้อมูลธุรกรรมหลัก (ผู้ใช้, ออเดอร์, การเงิน) ส่วน MongoDB เก็บ log, activity feed, หรือ content ที่ schema ยืดหยุ่น บน VPS ตัวเดียวรันได้ทั้งคู่ถ้า RAM พอ

คำสั่ง mongosh พื้นฐานที่ต้องรู้

Checklist หลังติดตั้ง MongoDB

  1. ติดตั้งจาก official repo (ไม่ใช้ Ubuntu repo) เพื่อได้เวอร์ชันใหม่
  2. เปิด authorization: enabled ทันที — ห้ามเปิด Production โดยไม่มี Auth
  3. สร้าง user แยกตาม database — ห้ามใช้ admin user ตรง
  4. ถ้าเปิด Remote ให้ เปิด UFW จำกัด IP เสมอ
  5. ตั้ง mongodump รายวัน + ส่ง backup ออกนอกเครื่อง
  6. ตรวจ disk space เป็นระยะ — MongoDB ใช้ disk มากกว่า MySQL

คำถามที่พบบ่อย (FAQ)

MongoDB ต้องใช้ VPS RAM เท่าไหร่ถึงจะพอ?

สำหรับทดสอบหรือเว็บเล็ก ๆ RAM 2GB พอเริ่มได้ แต่ MongoDB ใช้ RAM มากกว่า MySQL เพราะ WiredTiger cache จะพยายามเก็บ working set ไว้ใน memory ถ้าข้อมูลโตหรือมี query พร้อมกันหลายคน แนะนำ RAM 4GB ขึ้นไป และจำกัด cacheSizeGB ใน config เพื่อกันไม่ให้ MongoDB กิน RAM จนบริการอื่นบน VPS ล่ม VPS ของ AsiaGB เริ่มต้น 500 บาท/เดือน บน SSD เลือก RAM ได้ตามต้องการ

MongoDB กับ MySQL ใช้พร้อมกันบน VPS ตัวเดียวได้ไหม?

ได้ และเป็นเรื่องปกติมาก หลายระบบใช้ MySQL เก็บข้อมูลธุรกรรมหลัก ส่วน MongoDB เก็บ log หรือ content ที่ schema ยืดหยุ่น ทั้งสองบริการรันคนละ port (MySQL 3306, MongoDB 27017) ไม่ชนกัน แต่ต้องมั่นใจว่า VPS มี RAM เพียงพอสำหรับทั้งคู่ และตั้ง cacheSizeGB ของ MongoDB ให้เหมาะ ไม่งั้นทั้งสองจะแย่ง RAM กัน

ลืมรหัสผ่าน admin ของ MongoDB ทำอย่างไร?

หยุด mongod แล้วแก้ /etc/mongod.conf ปิด authorization: enabled ชั่วคราว restart เข้า mongosh โดยไม่ต้องใส่รหัส แล้วใช้ db.changeUserPassword("adminUser","NewPassword") ตั้งรหัสใหม่ จากนั้นเปิด authentication กลับและ restart อีกครั้ง ระหว่างที่ปิด auth ชั่วคราว ควรปิด remote access (bindIp กลับเป็น 127.0.0.1) หรือปิด firewall ไว้ก่อน

backup ด้วย mongodump ขณะที่ฐานข้อมูลกำลังใช้งานอยู่ได้ไหม?

ได้ mongodump อ่านข้อมูลแบบ online ไม่ต้องหยุดบริการ แต่สำหรับฐานข้อมูลขนาดใหญ่ที่มีการเขียนตลอด ค่า snapshot อาจไม่ consistent 100% ถ้าต้องการ backup ที่ point-in-time แม่นยำควรใช้ replica set + --oplog หรือทำ filesystem snapshot สำหรับเว็บทั่วไป mongodump รายคืนผ่าน cron แล้วส่งไฟล์ออกนอกเครื่องก็เพียงพอแล้ว

ต้องการ VPS สำหรับ MongoDB ที่เสถียร?

AsiaGB VPS Linux SSD เริ่มต้น 500 บาท/เดือน RAM พอใช้ MongoDB Full Root Access เลือกทำเลไทย / สิงคโปร์

ดูแพ็กเกจ VPS