ตั้ง Timezone และ NTP บน Linux VPS
ปัญหาเวลาผิดบน VPS เป็นสาเหตุที่ทำให้ cron job ทำงานผิดเวลา timestamp ใน log ดูสับสน และ SSL certificate มีปัญหา การตั้ง timezone ที่ถูกต้องและ sync เวลาผ่าน NTP เป็นสิ่งแรกที่ควรทำหลังรับ VPS ใหม่
ดูและเปลี่ยน Timezone
Ubuntu/Debian ใช้ timedatectl จัดการเวลาระบบ:
# ดู timezone ปัจจุบัน
timedatectl
# ดูรายชื่อ timezone ทั้งหมด
timedatectl list-timezones | grep Asia
# ตั้ง timezone เป็น Bangkok (UTC+7)
sudo timedatectl set-timezone Asia/Bangkok
# ยืนยัน
timedatectl status
Asia/Bangkok สะดวกกว่าตอนอ่าน log
ติดตั้งและตั้งค่า NTP
Ubuntu 20.04+ ใช้ systemd-timesyncd ในตัว ซึ่งเบากว่า ntpd เหมาะกับ VPS ทั่วไป:
# เปิดใช้ time sync
sudo timedatectl set-ntp true
# ตรวจสอบสถานะ
systemctl status systemd-timesyncd
# ดูว่า sync กับ server ไหน
cat /etc/systemd/timesyncd.conf
ถ้าต้องการ NTP server ไทย ให้แก้ไฟล์ config:
sudo nano /etc/systemd/timesyncd.conf
[Time]
NTP=0.th.pool.ntp.org 1.th.pool.ntp.org 2.th.pool.ntp.org
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org
# รีสตาร์ทเพื่อใช้ config ใหม่
sudo systemctl restart systemd-timesyncd
# ตรวจสอบการ sync
timedatectl show-timesync --all
ตั้ง Timezone สำหรับ PHP และ MySQL
ถ้าใช้ PHP web app ต้องตั้งในสองที่เพิ่มเติม:
# ตั้ง timezone ใน PHP
sudo nano /etc/php/8.3/fpm/php.ini
# แก้บรรทัด:
date.timezone = Asia/Bangkok
# ตั้งใน MySQL (เพิ่มใน /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
default-time-zone = '+07:00'
# reload services
sudo systemctl reload php8.3-fpm
sudo systemctl restart mysql
ตรวจสอบว่า Timezone/NTP ทำงานถูกต้อง
# ดูเวลาปัจจุบันพร้อม timezone
date
timedatectl
# ตรวจว่า NTP synchronized = yes
timedatectl | grep "NTP synchronized"
# ดู offset เทียบกับ NTP server
chronyc tracking 2>/dev/null || timedatectl show-timesync --all
# ทดสอบ PHP timezone
php -r "echo date('Y-m-d H:i:s T') . PHP_EOL;"
sudo systemctl restart cron เพื่อให้ cron jobs รับ timezone ใหม่
แก้ปัญหาที่พบบ่อย
Error: "Failed to set time zone: Failed to manipulate /etc/localtime"
/etc/localtime เป็น regular file ไม่ใช่ symlink ต้องลบและให้ timedatectl สร้างใหม่:
sudo rm /etc/localtime
sudo timedatectl set-timezone Asia/Bangkok
ls -la /etc/localtime # ควรเป็น symlink ไปยัง /usr/share/zoneinfo/
NTP synchronized: no ทั้งที่เปิด set-ntp true แล้ว
Firewall อาจ block UDP port 123 ที่ NTP ใช้ หรือ VPS provider บาง provider บล็อก NTP ออก:
# ตรวจ firewall
sudo ufw status | grep 123
# ทดสอบ connect ไป NTP server
ntpdate -q 0.pool.ntp.org
# ถ้า provider block ให้ใช้ NTP over TCP ผ่าน chronyd แทน
sudo apt install chrony -y
sudo systemctl enable --now chrony
PHP ยังแสดงเวลาผิดทั้งที่ตั้ง date.timezone แล้ว
PHP มี php.ini หลายไฟล์ขึ้นอยู่กับ SAPI (CLI, FPM, Apache) ต้องตรวจให้ครบทุกตัว:
# หาไฟล์ php.ini ที่ PHP ใช้จริง
php --ini | grep "Loaded Configuration"
php-fpm8.3 -i 2>/dev/null | grep "date.timezone"
# แก้ทุกไฟล์ที่เจอ เช่น
sudo sed -i 's|;date.timezone =|date.timezone = Asia/Bangkok|' /etc/php/*/cli/php.ini
sudo sed -i 's|;date.timezone =|date.timezone = Asia/Bangkok|' /etc/php/*/fpm/php.ini
Log เวลาผิดทั้งที่ system time ถูกต้อง
rsyslog หรือ journald อาจ log เป็น UTC เสมอ แก้โดย:
# ตั้ง rsyslog ให้แสดงเวลา local timezone
sudo nano /etc/rsyslog.conf
# เพิ่ม: $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# journald — ดู log ด้วย localtime
journalctl --since today -u nginx --output=short-iso
คำถามที่พบบ่อย
ควรตั้ง VPS เป็น UTC หรือ Asia/Bangkok?
ถ้าเป็น production server ที่มีหลาย service และ team developer หลายคน UTC เป็นมาตรฐานที่ดีกว่าเพราะหลีกเลี่ยงความสับสนเรื่อง DST (Daylight Saving Time) แต่ถ้าเป็น VPS ส่วนตัวที่ใช้คนเดียวในไทย Asia/Bangkok ทำให้อ่าน log ง่ายกว่า
timedatectl กับ ntpdate ต่างกันอย่างไร?
ntpdate เป็น legacy tool ที่ sync เวลาครั้งเดียวแล้วจบ ส่วน timedatectl set-ntp true เปิด systemd-timesyncd ที่คอย sync ต่อเนื่องตลอดเวลา ปัจจุบัน ntpdate ถูก deprecate แล้วใน Ubuntu ควรใช้ timesyncd หรือ chrony แทน
เปลี่ยน timezone ต้อง reboot ไหม?
ไม่ต้อง เปลี่ยน timezone ด้วย timedatectl มีผลทันที แต่ process ที่รันอยู่แล้วอาจยังใช้ timezone เดิมอยู่ ต้อง restart service ที่สำคัญ เช่น MySQL, PHP-FPM, cron เพื่อให้รับ timezone ใหม่