คำตอบสั้น ๆ: ย้ายไฟล์และฐานข้อมูล WordPress ไปโฮสต์ใหม่ด้วยตนเอง ทดสอบผ่านไฟล์ hosts ก่อนเปลี่ยน DNS เพื่อให้เว็บไซต์ไม่หยุดให้บริการระหว่างย้าย
คู่มือนี้อธิบาย WordPress ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
การย้ายเว็บไซต์ WordPress ไปโฮสต์ใหม่ประกอบด้วยการย้ายสองส่วนเสมอ คือ ไฟล์ (ตัว WordPress, ธีม, ปลั๊กอิน และไฟล์ใน wp-content/uploads) และ ฐานข้อมูล (บทความ หน้าเว็บ การตั้งค่า และผู้ใช้) เมื่อย้ายครบแล้วจึงชี้โดเมนไปที่โฮสต์ใหม่ คู่มือนี้อธิบายวิธีย้ายด้วยตนเองผ่าน SSH ซึ่งใช้ได้กับเว็บทุกขนาด และกล่าวถึงวิธีใช้ปลั๊กอินโดยสรุป
หัวใจของการย้ายโดยไม่ให้เว็บล่มคือ เตรียมเว็บบนโฮสต์ใหม่ให้เสร็จและทดสอบก่อน แล้วจึงเปลี่ยน DNS เป็นขั้นตอนสุดท้าย
สิ่งที่ต้องเตรียม (WordPress)
- สิทธิ์ SSH หรืออย่างน้อย FTP และ phpMyAdmin บนโฮสต์เดิม
- โฮสต์ใหม่ที่พร้อมใช้งาน เช่น Web Hosting ที่ใช้ Plesk หรือ DirectAdmin หรือ Cloud Server ที่ติดตั้ง Web Server, PHP และ MariaDB/MySQL แล้ว
- เวอร์ชัน PHP บนโฮสต์ใหม่ที่ธีมและปลั๊กอินรองรับ ควรเท่ากับหรือใหม่กว่าโฮสต์เดิมเล็กน้อย
- สิทธิ์แก้ไข DNS ของโดเมน
- พื้นที่ว่างเพียงพอบนทั้งสองฝั่งสำหรับไฟล์สำรอง
หมายเหตุ: สำรองเว็บไซต์ทั้งไฟล์และฐานข้อมูลเก็บไว้ในเครื่องของคุณก่อนเริ่ม และงดแก้ไขเนื้อหาหรือรับคำสั่งซื้อบนเว็บเดิมระหว่างย้าย เพื่อไม่ให้ข้อมูลที่เกิดขึ้นระหว่างทางสูญหาย
ขั้นตอนที่ 1: ลดค่า TTL ของ DNS ล่วงหน้า (WordPress)
อย่างน้อย 24 ชั่วโมงก่อนย้าย ให้ลดค่า TTL ของ A Record ของโดเมนและ www ลงเหลือประมาณ 300 วินาที เพื่อให้การเปลี่ยน IP ในวันย้ายมีผลเร็ว ดูความหมายของ Record แต่ละชนิดได้ที่ ทำความรู้จัก DNS Record
ขั้นตอนที่ 2: ดูข้อมูลฐานข้อมูลจาก wp-config.php
บนโฮสต์เดิม เข้าไปที่โฟลเดอร์ของเว็บ (ตัวอย่างนี้ใช้ /var/www/example.com ให้เปลี่ยนเป็นพาธจริง) แล้วดูค่าฐานข้อมูล
cd /var/www/example.com
grep -E "DB_NAME|DB_USER|DB_HOST|table_prefix" wp-config.php
จดชื่อฐานข้อมูล ชื่อผู้ใช้ และ $table_prefix ไว้ ค่า prefix ต้องเหมือนเดิมบนโฮสต์ใหม่
ขั้นตอนที่ 3: Export ฐานข้อมูล
mysqldump --single-transaction --default-character-set=utf8mb4 -u DBUSER -p DBNAME > ~/site-db.sql
ระบบจะถามรหัสผ่านของผู้ใช้ฐานข้อมูล เมื่อเสร็จจะไม่มีข้อความแสดง ตรวจสอบว่าไฟล์มีขนาดสมเหตุสมผลและจบไฟล์สมบูรณ์
ls -lh ~/site-db.sql
tail -n 1 ~/site-db.sql
บรรทัดสุดท้ายควรเป็น -- Dump completed on ... หากใช้ Shared Hosting ที่ไม่มี SSH สามารถใช้เมนู Export ใน phpMyAdmin แทนได้ ดูรายละเอียดการสำรองเพิ่มเติมที่ สำรองและกู้คืนฐานข้อมูล MySQL/MariaDB ด้วย mysqldump
ขั้นตอนที่ 4: บีบอัดไฟล์เว็บไซต์
tar -czf ~/site-files.tar.gz -C /var/www/example.com .
คำสั่งนี้รวมทุกไฟล์รวมถึงไฟล์ซ่อนอย่าง .htaccess หากเว็บมีโฟลเดอร์ Cache ขนาดใหญ่ เช่น wp-content/cache สามารถยกเว้นได้ด้วย --exclude=./wp-content/cache (วางไว้ก่อน -C)
ขั้นตอนที่ 5: ส่งไฟล์ไปยังโฮสต์ใหม่
จากโฮสต์เดิม ส่งไฟล์ทั้งสองไปยังโฮสต์ใหม่ด้วย scp หรือ rsync
rsync -avP ~/site-db.sql ~/site-files.tar.gz user@NEW_SERVER_IP:~/
หากไม่มี SSH ทั้งสองฝั่ง ให้ดาวน์โหลดไฟล์ลงเครื่องของคุณแล้วอัปโหลดขึ้นโฮสต์ใหม่ผ่าน File Manager หรือ FTP
ขั้นตอนที่ 6: สร้างฐานข้อมูลและนำเข้าบนโฮสต์ใหม่
บน Plesk หรือ DirectAdmin ให้สร้างฐานข้อมูลและผู้ใช้จากหน้า Databases ของ Control Panel (ดู สร้างฐานข้อมูล MySQL บน DirectAdmin) บน Cloud Server ดูวิธีสร้างด้วยคำสั่งได้ที่ สร้างฐานข้อมูลและผู้ใช้ MySQL/MariaDB จากนั้นนำเข้า
mysql --default-character-set=utf8mb4 -u NEWDBUSER -p NEWDBNAME < ~/site-db.sql
ถ้าสำเร็จจะไม่มีข้อความแสดง
ขั้นตอนที่ 7: แตกไฟล์และแก้ไข wp-config.php
แตกไฟล์ลงในโฟลเดอร์เว็บของโดเมนบนโฮสต์ใหม่ บน Plesk มักเป็น /var/www/vhosts/example.com/httpdocs บน DirectAdmin มักเป็น /home/USERNAME/domains/example.com/public_html ให้ลบไฟล์หน้าเริ่มต้นที่ระบบสร้างไว้ เช่น index.html ก่อน
cd /path/to/document-root
tar -xzf ~/site-files.tar.gz
แก้ไข wp-config.php ให้ใช้ค่าฐานข้อมูลใหม่
define( 'DB_NAME', 'NEWDBNAME' );
define( 'DB_USER', 'NEWDBUSER' );
define( 'DB_PASSWORD', 'NEWDBPASSWORD' );
define( 'DB_HOST', 'localhost' );
ตรวจสิทธิ์เจ้าของไฟล์ให้ตรงกับผู้ใช้ที่ Web Server หรือ PHP-FPM ใช้งาน หากแตกไฟล์ด้วย root บน Cloud Server ที่ใช้ Nginx บน Ubuntu ตัวอย่างคือ
sudo chown -R www-data:www-data /path/to/document-root
บน Plesk และ DirectAdmin ให้แตกไฟล์ด้วยผู้ใช้ของโดเมนนั้นเอง ไม่ใช่ root เพื่อให้สิทธิ์ถูกต้องตั้งแต่แรก