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

Home ตั้งค่า Timezone และซิงก์เวลาอัตโนมัติบน Linux Server

ตั้งค่า Timezone และซิงก์เวลาอัตโนมัติบน Linux Server

Cloud Server ส่วนใหญ่ตั้ง Timezone เป็น UTC มาตั้งแต่ต้น ซึ่งช้ากว่าเวลาประเทศไทย 7 ชั่วโมง ผลที่ตามมาคือเวลาใน Log ไม่ตรงกับเวลาที่เกิดเหตุจริง Cronjob ที่ตั้งไว้ตี 2 กลับทำงานตอน 9 โมงเช้า และเวลาในอีเมลหรือรายงานผิดเพี้ยน นอกจาก Timezone แล้ว นาฬิกาของเครื่องก็ต้องตรงด้วย เพราะเวลาที่คลาดเคลื่อนทำให้ SSL/TLS, การยืนยันตัวตนแบบ OTP และ Replication ของฐานข้อมูลมีปัญหาได้

คู่มือนี้อธิบายการตั้ง Timezone เป็น Asia/Bangkok และการเปิดซิงก์เวลาอัตโนมัติผ่าน NTP บน Ubuntu 22.04/24.04 (ใช้ systemd-timesyncd) และ AlmaLinux/Rocky Linux 8-9 (ใช้ chrony)

สิ่งที่ต้องเตรียม

  • สิทธิ์ root หรือผู้ใช้ที่ใช้ sudo ได้
  • เซิร์ฟเวอร์ต้องออกอินเทอร์เน็ตทาง UDP Port 123 ได้ (ส่วนใหญ่เปิดอยู่แล้ว เพราะเป็นการเชื่อมต่อขาออก)
  • ถ้าเซิร์ฟเวอร์รันฐานข้อมูลหรือแอปที่พึ่งพาเวลา ให้เลือกช่วงเวลาที่กระทบผู้ใช้น้อยสำหรับรีสตาร์ตบริการหลังเปลี่ยน Timezone

ขั้นตอนที่ 1: ดูการตั้งค่าเวลาปัจจุบัน

timedatectl

ตัวอย่างผลลัพธ์บนเครื่องที่ยังเป็น UTC

               Local time: Sat 2026-09-19 02:15:04 UTC
           Universal time: Sat 2026-09-19 02:15:04 UTC
                 RTC time: Sat 2026-09-19 02:15:04
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

บรรทัดที่ต้องดูคือ Time zone, System clock synchronized (นาฬิกาซิงก์แล้วหรือยัง) และ NTP service (บริการซิงก์เวลาทำงานอยู่หรือไม่)

ขั้นตอนที่ 2: ตั้ง Timezone เป็นเวลาประเทศไทย

ดูชื่อ Timezone ที่ถูกต้องก่อน

timedatectl list-timezones | grep -i bangkok

ผลลัพธ์คือ Asia/Bangkok จากนั้นตั้งค่า

sudo timedatectl set-timezone Asia/Bangkok

คำสั่งนี้แก้ลิงก์ /etc/localtime ให้ชี้ไปยังข้อมูล Timezone ใหม่ และมีผลทันทีโดยไม่ต้องรีบูต ส่วน Ubuntu ยังมีไฟล์ /etc/timezone ที่บางโปรแกรมอ่าน ถ้าไฟล์นี้ยังแสดงค่าเดิม ให้รัน sudo dpkg-reconfigure -f noninteractive tzdata เพื่อให้ตรงกัน

หมายเหตุ: บางทีมเลือกให้เซิร์ฟเวอร์อยู่ที่ UTC ต่อไป แล้วให้แอปแปลงเป็นเวลาท้องถิ่นเอง ซึ่งสะดวกเมื่อมีเซิร์ฟเวอร์หลายประเทศ ถ้าเซิร์ฟเวอร์ทั้งหมดของคุณให้บริการในไทย การตั้งเป็น Asia/Bangkok จะอ่าน Log และตั้ง Cronjob ได้ง่ายกว่า ประเทศไทยไม่มีการปรับเวลาตามฤดูกาล จึงไม่มีปัญหาเวลาซ้ำหรือหายไปปีละครั้ง

ขั้นตอนที่ 3: เปิดการซิงก์เวลาอัตโนมัติ

sudo timedatectl set-ntp true

คำสั่งนี้เปิดบริการซิงก์เวลาที่ติดตั้งอยู่ในเครื่อง แต่ละ Distro ใช้บริการต่างกัน ตรวจตามหัวข้อด้านล่าง

Ubuntu: systemd-timesyncd

systemctl status systemd-timesyncd
timedatectl timesync-status

สถานะต้องเป็น active (running) ส่วน timesync-status แสดง Server ที่ใช้ (ค่าเริ่มต้นคือ ntp.ubuntu.com) และค่า Offset ซึ่งควรเป็นหลักมิลลิวินาทีหรือน้อยกว่า ถ้าไม่พบ Service นี้ ให้ติดตั้งด้วย sudo apt install systemd-timesyncd

ถ้าต้องการเปลี่ยน Server เช่น ใช้ Pool ของประเทศไทย ให้สร้างไฟล์ตั้งค่าเพิ่มเติม

sudo mkdir -p /etc/systemd/timesyncd.conf.d
sudo nano /etc/systemd/timesyncd.conf.d/local.conf
[Time]
NTP=0.th.pool.ntp.org 1.th.pool.ntp.org
FallbackNTP=ntp.ubuntu.com
sudo systemctl restart systemd-timesyncd

AlmaLinux / Rocky Linux: chrony

sudo dnf install -y chrony
sudo systemctl enable --now chronyd
chronyc tracking
chronyc sources -v

chronyc tracking ต้องมี Leap status : Normal และค่า System time ที่ห่างจากเวลาจริงเพียงเล็กน้อย ส่วน chronyc sources ต้องมีอย่างน้อยหนึ่ง Server ที่ขึ้นต้นด้วย ^* ซึ่งหมายถึง Server ที่กำลังซิงก์อยู่

เปลี่ยน Server ได้ที่ไฟล์ /etc/chrony.conf โดยแก้บรรทัด pool เดิม เช่น

pool th.pool.ntp.org iburst
sudo systemctl restart chronyd

หมายเหตุ: ติดตั้งบริการซิงก์เวลาเพียงตัวเดียว ถ้าติดตั้ง chrony บน Ubuntu แพ็กเกจจะถอด systemd-timesyncd ออกให้เอง แต่อย่าติดตั้ง ntpd คู่กับ chrony เพราะจะแย่งกันปรับนาฬิกา

ขั้นตอนที่ 4: รีสตาร์ตบริการที่อ่าน Timezone ตอนเริ่มทำงาน

โปรแกรมหลายตัวอ่าน Timezone ครั้งเดียวตอนเริ่มทำงาน จึงยังใช้เวลาเดิมจนกว่าจะรีสตาร์ต ได้แก่

  • Cron: sudo systemctl restart cron (Ubuntu) หรือ sudo systemctl restart crond (AlmaLinux/Rocky)
  • Syslog: sudo systemctl restart rsyslog ถ้ามีติดตั้ง
  • MySQL/MariaDB ที่ใช้ time_zone = SYSTEM (ค่าเริ่มต้น): รีสตาร์ตในช่วงเวลาที่กระทบผู้ใช้น้อย
  • PHP-FPM, Web Server และแอปอื่นที่รันค้างอยู่

สำหรับ PHP ควรตั้ง date.timezone = Asia/Bangkok ใน php.ini ด้วย เพราะ PHP ไม่ได้อ่าน Timezone ของระบบเสมอไป ถ้าไม่แน่ใจว่าต้องรีสตาร์ตอะไรบ้าง การรีบูตเครื่องหนึ่งครั้งเป็นวิธีที่ครอบคลุมที่สุด

ส่วน Cronjob ที่ตั้งไว้ก่อนหน้า จะเริ่มทำงานตามเวลาไทยหลังรีสตาร์ต Cron ถ้าเดิมคุณตั้งเวลาโดยคำนวณจาก UTC ไว้ (เช่น ตั้ง 0 19 * * * เพื่อให้ทำงานตี 2 เวลาไทย) ต้องแก้ใหม่ ดูรูปแบบเวลาได้ที่ วิธีตั้ง Cronjob หรือ Crontab บน Linux

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

timedatectl
date

ผลลัพธ์ที่ถูกต้อง

                Time zone: Asia/Bangkok (+07, +0700)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

และ date ต้องแสดงเวลาตรงกับนาฬิกาในประเทศไทย ลงท้ายด้วย +07 ค่า RTC in local TZ: no คือค่าที่ถูกต้องสำหรับเซิร์ฟเวอร์ Linux (นาฬิกาฮาร์ดแวร์เก็บเป็น UTC) ไม่ต้องเปลี่ยน

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

System clock synchronized: no

บริการซิงก์ยังติดต่อ Server ไม่ได้ ตรวจว่าไม่มี Firewall ปิดขาออก UDP 123 ดู Log ด้วย journalctl -u systemd-timesyncd -n 30 (Ubuntu) หรือ journalctl -u chronyd -n 30 (AlmaLinux/Rocky) หลังเปิดบริการใหม่ อาจต้องรอหนึ่งถึงสองนาทีจนซิงก์ครั้งแรกสำเร็จ

set-ntp แจ้ง Failed to set ntp: NTP not supported

ยังไม่มีบริการซิงก์เวลาติดตั้งอยู่ ให้ติดตั้ง systemd-timesyncd บน Ubuntu หรือ chrony บน AlmaLinux/Rocky ตามขั้นตอนที่ 3 แล้วรันคำสั่งอีกครั้ง

เวลาในแอปหรือฐานข้อมูลยังไม่เปลี่ยน

บริการนั้นยังไม่ได้รีสตาร์ต หรือตั้ง Timezone ของตัวเองไว้ ตรวจ MySQL/MariaDB ด้วย SELECT @@global.time_zone, @@system_time_zone, NOW(); และตรวจ PHP ด้วย php -i | grep date.timezone สำหรับ Container ของ Docker ต้องตั้งแยก เช่น ส่งตัวแปร TZ=Asia/Bangkok ให้ Container

หากตั้งค่าแล้วเวลายังไม่ตรง หรือไม่แน่ใจว่าบริการใดได้รับผลกระทบ ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

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

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