การอัปเดต Ubuntu Server ไม่ใช่เรื่องน่ากังวล แต่สิ่งที่เสี่ยงที่สุดคือ การรีบ Reboot โดยไม่ตรวจสอบระบบ เพราะการรีสตาร์ตเครื่องคือการเริ่มต้น Service, Kernel, Network และ Application ใหม่ทั้งหมด หากมี Service ใดไม่สามารถเริ่มทำงานได้ เว็บไซต์อาจใช้งานไม่ได้ทันที
1. รู้ก่อนว่าเซิร์ฟเวอร์ให้บริการอะไร
ก่อนอัปเดต ควรรู้ว่ามีองค์ประกอบใดกำลังทำงานอยู่ เช่น
- Web Server: Nginx, Apache
- Application: Node.js, PHP-FPM, Python, Docker
- Database: MySQL, PostgreSQL
- Cache: Redis
- Worker หรือ Queue Service
การรู้โครงสร้างระบบจะช่วยให้ตรวจสอบหลัง Reboot ได้ครบทุกส่วน
2. Backup ก่อนทุกครั้ง
ควรมีแผนย้อนกลับเสมอ
- Snapshot VM หรือ Cloud Instance
- Backup Database และทดสอบว่าสามารถ Restore ได้
- สำรองไฟล์ Config เช่น
- /etc/nginx
- .env
- docker-compose.yml
- Cron Job
- เก็บไฟล์ Config ไว้ใน Git หรือพื้นที่สำรอง
Backup ที่ไม่เคยทดสอบการกู้คืน อาจไม่ใช่ Backup ที่ใช้งานได้จริง
3. ตรวจสุขภาพระบบก่อนอัปเดต
df -h
free -h
systemctl --failed
sudo journalctl -p err -b
ตรวจสอบว่า
- Disk เหลือเพียงพอ
- RAM ปกติ
- ไม่มี Service ล้มอยู่ก่อน
- ไม่มี Error สำคัญตั้งแต่ Boot ล่าสุด
หากมีปัญหาเดิมอยู่ ควรแก้ก่อนอัปเดต เพื่อไม่ให้สับสนว่าปัญหาเกิดจากการ Update หรือไม่
4. ดูรายการที่จะอัปเดตก่อน
sudo apt update
apt list --upgradable
sudo apt upgrade --simulate
การใช้ --simulate
ช่วยให้เห็นว่า
- Kernel
- OpenSSL
- Docker
- Nginx
- Database
- Library สำคัญ
จะถูกอัปเดตหรือไม่
อย่าใช้
sudo apt upgrade -y
โดยไม่ตรวจสอบรายการก่อน โดยเฉพาะบน Production Server
5. อัปเดตอย่างระมัดระวัง
sudo apt upgrade
หากระบบถามเกี่ยวกับไฟล์ Config
- เก็บ Config เดิมไว้ก่อน
- เปรียบเทียบความแตกต่างภายหลัง
- อย่ารีบเขียนทับไฟล์ที่ทีมงานเคยแก้ไข
6. ใช้ Full Upgrade เมื่อจำเป็น
sudo apt full-upgrade
คำสั่งนี้อาจ
- เพิ่ม Package
- ลบ Package
- เปลี่ยน Dependency
จึงควรใช้เฉพาะเมื่อเข้าใจผลกระทบ และควรทำในช่วง Maintenance Window
7. ตรวจว่าจำเป็นต้อง Reboot หรือไม่
test -f /var/run/reboot-required && echo reboot-needed
ไม่ใช่ทุกการอัปเดตจำเป็นต้อง Restart
แต่หากมี
- Kernel
- libc
- Security Patch สำคัญ
ควรวางแผน Reboot ให้เรียบร้อย
8. วางแผน Reboot
สำหรับระบบ Production
- แจ้งทีมงาน
- เปิด Maintenance Page
- หากมีหลายเครื่อง ให้ใช้ Rolling Update
แนวทางคือ
- นำเครื่องแรกออกจาก Load Balancer
- Update
- Reboot
- ตรวจ Health
- จึงทำเครื่องถัดไป
ช่วยลด Downtime ของระบบได้อย่างมาก
9. หลัง Reboot อย่าดูแค่ SSH เข้าได้
ตรวจสอบ Service สำคัญ
systemctl status nginx
systemctl status php8.3-fpm
docker ps
systemctl --failed
SSH เข้าได้ ไม่ได้แปลว่าเว็บไซต์พร้อมใช้งาน
10. ทดสอบเหมือนผู้ใช้จริง
ภายในเครื่อง
curl -I http://127.0.0.1
ภายนอก
curl -I https://your-domain.example
จากนั้นตรวจสอบ
- หน้า Login
- API
- Database Connection
- Upload File
- Dashboard
- งาน Background
อย่าทดสอบเฉพาะหน้าแรกของเว็บไซต์
11. หากเว็บล่มหลัง Reboot
สาเหตุที่พบได้บ่อย
- Service ไม่ได้ Enable
- Firewall ปิด Port
- Environment Variable ไม่ถูกโหลด
- Mount Disk ยังไม่พร้อม
- Database เริ่มช้ากว่า Application
- Docker Container ไม่ได้ Restart อัตโนมัติ
ตรวจสอบ Log
sudo journalctl -u <service-name> -b
จะช่วยหาสาเหตุได้เร็วกว่าการเดา
12. สร้าง Health Check
ควรมี Endpoint เช่น
/health
ตรวจสอบว่า
- Web Server ทำงาน
- Database เชื่อมต่อได้
- Redis พร้อม
- Queue ทำงาน
- Storage พร้อมใช้งาน
หรือสร้าง Script สำหรับตรวจทุกบริการในคำสั่งเดียว เพื่อใช้หลัง Reboot ทุกครั้ง
Checklist การอัปเดต Ubuntu Server
✅ Backup และ Snapshot ก่อนอัปเดต
✅ ตรวจสุขภาพระบบ (df, free, systemctl)
✅ ดูรายการ Package ที่จะอัปเดต
✅ ใช้ apt upgrade --simulate
✅ อ่านข้อความเกี่ยวกับ Config ก่อนกดตอบ
✅ Reboot เฉพาะเมื่อจำเป็น
✅ วางแผน Maintenance Window
✅ ตรวจสอบทุก Service หลัง Boot
✅ ทดสอบเว็บไซต์จากมุมมองผู้ใช้จริง
✅ ตรวจสอบ Log หากพบปัญหา
สรุป
การอัปเดต Ubuntu Server ที่ปลอดภัยไม่ใช่การหลีกเลี่ยงการ Reboot แต่คือการมีขั้นตอนที่ชัดเจน ได้แก่ สำรองข้อมูล ตรวจสอบรายการอัปเดต วางแผนช่วงเวลาบำรุงรักษา ตรวจสอบ Service หลัง Boot และทดสอบการทำงานของระบบอย่างครบถ้วน เมื่อทำเป็นมาตรฐานทุกเดือน การติดตั้ง Security Update จะกลายเป็นงานบำรุงรักษาปกติที่ลดความเสี่ยงและช่วยให้ระบบมีความปลอดภัยและเสถียรมากขึ้น
Bash file
หากต้องการให้การอัปเดต Ubuntu Server ปลอดภัยและทำซ้ำได้ทุกครั้ง สามารถเขียน Bash Script เพื่อช่วยตรวจสอบระบบก่อนและหลังอัปเดตได้ โดย สคริปต์นี้จะไม่ Reboot อัตโนมัติ เพื่อให้ผู้ดูแลระบบเป็นผู้ตัดสินใจเอง
#!/usr/bin/env bash
#
# Ubuntu Server Safe Update Script
# Version: 1.0
#
set -euo pipefail
LOGFILE="/var/log/safe-update-$(date +%F-%H%M%S).log"
exec > >(tee -a "$LOGFILE")
exec 2>&1
echo "======================================"
echo " Ubuntu Safe Update"
echo " Started : $(date)"
echo "======================================"
echo
echo "[1] Disk Usage"
df -h
echo
echo "[2] Memory"
free -h
echo
echo "[3] Failed Services"
systemctl --failed || true
echo
echo "[4] Boot Errors"
journalctl -p err -b --no-pager || true
echo
echo "[5] Updating Package List..."
apt update
echo
echo "[6] Upgradable Packages"
apt list --upgradable
echo
echo "[7] Simulate Upgrade"
apt upgrade --simulate
echo
read -p "Continue upgrade? (y/N): " ans
if [[ ! "$ans" =~ ^[Yy]$ ]]; then
echo "Cancelled."
exit 0
fi
echo
echo "[8] Running Upgrade..."
apt upgrade
echo
echo "[9] Checking Reboot Requirement"
if [[ -f /var/run/reboot-required ]]; then
echo "======================================"
echo " Reboot is REQUIRED"
cat /var/run/reboot-required.pkgs 2>/dev/null || true
echo "======================================"
else
echo "No reboot required."
fi
echo
echo "Upgrade Completed."
echo "Log : $LOGFILE"
หลัง Reboot ใช้สคริปต์ตรวจสุขภาพระบบ
สร้างไฟล์ health-check.sh
#!/usr/bin/env bash
echo "=============================="
echo " Ubuntu Health Check"
echo "=============================="
echo
echo "Hostname : $(hostname)"
echo "Uptime : $(uptime -p)"
echo
echo "Disk"
df -h
echo
echo "Memory"
free -h
echo
echo "Failed Services"
systemctl --failed
echo
echo "Nginx"
systemctl is-active nginx 2>/dev/null
echo
echo "Apache"
systemctl is-active apache2 2>/dev/null
echo
echo "PHP-FPM"
systemctl list-units --type=service | grep php || true
echo
echo "Docker"
docker ps 2>/dev/null || true
echo
echo "Redis"
systemctl is-active redis 2>/dev/null
echo
echo "MySQL"
systemctl is-active mysql 2>/dev/null
echo
echo "PostgreSQL"
systemctl is-active postgresql 2>/dev/null
echo
echo "HTTP Local Test"
curl -I http://127.0.0.1 --max-time 5 || true
echo
echo "HTTPS Local Test"
curl -k -I https://127.0.0.1 --max-time 5 || true
echo
echo "Boot Errors"
journalctl -p err -b --no-pager
วิธีใช้งาน
ให้สิทธิ์รันสคริปต์
chmod +x safe-update.sh
chmod +x health-check.sh
รันอัปเดต
sudo ./safe-update.sh
เมื่อ Reboot เสร็จแล้ว
sudo ./health-check.sh
แนะนำเพิ่มเติมสำหรับ Production Server
สามารถพัฒนาสคริปต์นี้ให้มีความสามารถเพิ่มขึ้น เช่น
- สำรองไฟล์ /etc อัตโนมัติก่อนอัปเดต
- สำรองฐานข้อมูล MySQL/PostgreSQL
- ตรวจสอบพื้นที่ดิสก์ขั้นต่ำ (เช่น ต้องเหลือไม่น้อยกว่า 20%)
- ส่งผลการอัปเดตไปยัง Slack, Discord หรือ LINE Notify
- ตรวจสอบ Health Check ของเว็บไซต์หลายโดเมนพร้อมกัน
- รองรับ Nginx, Apache, Docker, Docker Compose, Node.js, PHP, Python และ Redis โดยอัตโนมัติ
- สร้างรายงานเป็นไฟล์ HTML หรือ Markdown เพื่อเก็บประวัติการอัปเดตแต่ละครั้ง
เวอร์ชันลักษณะนี้จะเหมาะสำหรับใช้เป็นเครื่องมือมาตรฐานในการดูแล Ubuntu Server ทั้งเครื่อง Development, Staging และ Production.
ความคิดเห็น
แสดงความคิดเห็น