ปัญหา Time Zone ใน Linux วิธีตั้งค่าให้ถูกต้องและป้องกันปัญหา
ปัญหา Time Zone ใน Linux เกิดจากการที่ระบบถูกตั้ง timezone เป็น UTC เป็นค่าเริ่มต้น ทำให้เวลาคลาดเคลื่อนจากเวลาไทย 7 ชั่วโมง ส่งผลให้ log แสดงเวลาผิด CronJob รันผิดเวลา และแอปพลิเคชันแสดงเวลาไม่ตรง วิธีแก้ไขคือใช้คำสั่ง timedatectl set-timezone Asia/Bangkok แล้วเปิด NTP sync เพียงเท่านี้ก็เรียบร้อย
ตรวจสอบ Timezone ปัจจุบัน
ก่อนจะแก้อะไร ต้องรู้ก่อนว่าระบบตั้ง timezone เป็นอะไร ใช้คำสั่ง timedatectl ได้เลย
timedatectl
คำสั่งนี้จะแสดง Local time, Universal time, RTC time และ Time zone ปัจจุบัน ถ้าเห็นว่าเป็น UTC หรือ timezone อื่นที่ไม่ใช่ Asia/Bangkok ก็ต้องเปลี่ยน
วิธีเปลี่ยน Timezone ให้ถูกต้อง
ใช้ timedatectl (วิธีที่แนะนำ)
วิธีมาตรฐานบน systemd-based distro ทั้ง Ubuntu, CentOS, Debian ใช้ได้หมด
timedatectl set-timezone Asia/Bangkok
แค่บรรทัดเดียวก็เรียบร้อย ลองรัน timedatectl อีกทีเพื่อยืนยัน
ใช้ symlink กับ /etc/localtime
สำหรับระบบเก่าที่ไม่มี timedatectl
ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime
echo "Asia/Bangkok" | tee /etc/timezone
วิธีนี้ใช้ได้กับแทบทุก distro แม้ระบบ minimal ที่ไม่ได้ติดตั้ง systemd
ตั้งค่า NTP Sync ให้เวลาตรง
เปลี่ยน timezone อย่างเดียวไม่พอ ต้องทำให้นาฬิกาของเซิร์ฟเวอร์ sync กับ NTP server ด้วย
timedatectl set-ntp true
ถ้าใช้ chrony สามารถเช็คสถานะได้ด้วย
chronyc tracking
NTP sync สำคัญสำหรับงานที่ต้องการความแม่นยำ เช่น database replication, log correlation ระหว่างหลาย server หรือ certificate validation
ทำไม Timezone ถึงสำคัญกับ Server
Log Analysis
เวลาใน log file ถ้าไม่ตรงกับเวลาจริง การ debug ปัญหาจะยากขึ้นมาก โดยเฉพาะเวลาต้อง correlate log จากหลาย service
Cron Jobs
cron ใช้เวลาของระบบในการรัน ถ้า timezone ผิด job ที่ตั้งไว้ตอนตี 2 อาจไปรันตอน 9 โมงเช้าแทน
Application Layer
web application หลายตัวใช้เวลาของ server ในการแสดงผล ถ้าผู้ใช้เห็นเวลาผิดจะสร้างความสับสน
Database
timestamp ใน database ถ้าบันทึกผิด timezone จะทำให้ query ที่ filter ตามเวลาได้ผลลัพธ์ไม่ถูกต้อง
คำถามที่พบบ่อย
เปลี่ยน timezone แล้ว cron job จะเปลี่ยนตามไหม?
เปลี่ยนตาม แต่ต้อง restart cron service ก่อนด้วยคำสั่ง systemctl restart cron หรือ systemctl restart crond เพื่อให้ cron อ่านค่า timezone ใหม่
ควรตั้ง server เป็น UTC หรือ local timezone?
ขึ้นอยู่กับการใช้งาน ถ้า server ให้บริการหลายประเทศ ใช้ UTC แล้วแปลงเวลาใน application layer จะดีกว่า ถ้าให้บริการเฉพาะในไทย ตั้งเป็น Asia/Bangkok ได้เลย
Docker container ใช้ timezone ของ host ไหม?
ไม่ Docker container มี timezone แยกจาก host ต้องตั้งค่าเพิ่มเติม เช่น mount /etc/localtime เข้า container หรือตั้ง environment variable TZ=Asia/Bangkok
เปลี่ยน timezone ต้อง reboot server ไหม?
ไม่ต้อง การเปลี่ยน timezone ด้วย timedatectl มีผลทันทีโดยไม่ต้อง reboot แต่ application บางตัวอาจต้อง restart เพื่ออ่านค่า timezone ใหม่
ตั้งค่า Timezone ได้ง่ายกับ VPS ของ DriteStudio
ปัญหา timezone ใน Linux แก้ไม่ยาก แค่ใช้ timedatectl ตั้งค่าให้ถูกแล้วเปิด NTP sync ก็จบ สำหรับผู้ที่ไม่อยากยุ่งยากกับการตั้งค่าเอง VPS ของ DriteStudio มี timezone Asia/Bangkok และ NTP sync ตั้งค่ามาให้พร้อมใช้งานตั้งแต่แรก หรือหากต้องการ Dedicated Server ก็ได้รับการดูแลเช่นเดียวกัน ติดต่อ DriteStudio วันนี้เพื่อรับเซิร์ฟเวอร์ที่พร้อมใช้งานทันที