ย้ายไฟล์สื่อ WordPress ขึ้น Cloudflare R2 โดยไม่ทำ URL พัง
คลังสื่อ WordPress โตไปทางเดียว ทุกภาพกลายเป็นไฟล์ย่อหลายขนาด ทุกปีเพิ่มพื้นที่อีกหลายกิกะไบต์ และสุดท้ายเว็บก็จ่ายค่าพื้นที่ในราคาของเครื่องรันแอป เพื่อเก็บไฟล์นิ่ง ๆ ที่ถ้าไปอยู่ที่อื่นจะแทบไม่มีค่าใช้จ่ายเลย
การย้ายไฟล์ขึ้นคลาวด์ (offload) คือการเอาไฟล์เหล่านั้นไปไว้บน object storage แล้วเสิร์ฟจากที่นั่น ถ้าทำอย่างระวังจะไม่มีใครรู้สึกอะไรเลย แต่ถ้าทำแบบลวก ๆ นี่คือเหตุผลที่ภาพของใครบางคนขึ้น 404 ในอีกสองปีถัดมา
ทำไมต้อง R2
object storage คิดเงินสามอย่าง คือค่าพื้นที่ ค่า operation และค่า egress สำหรับคลังสื่อ ค่า egress คือตัวที่ทำให้คนตกใจ เพราะทุกคนที่เปิดหน้าเว็บ คือการดึงข้อมูลออกจากบักเก็ต และผู้ให้บริการส่วนใหญ่คิดเงินตรงนี้
Cloudflare R2 ไม่คิดค่า egress ความต่างข้อเดียวนี้เปลี่ยนเว็บที่มีสื่อเยอะ จากบิลที่คาดเดาไม่ได้ ให้กลายเป็นค่าพื้นที่คงที่ และ R2 ยังคุยด้วย S3 API อะไรที่ใช้กับ S3 ได้จึงใช้กับ R2 ได้
ถ้าคุณมี S3, DigitalOcean Spaces, Backblaze B2, Wasabi หรือ MinIO ที่ตั้งเองอยู่แล้ว ทุกตัวก็ทำงานแบบเดียวกัน เหตุผลทั้งหมดข้างล่างนี้ใช้ได้กับทุกเจ้า
สิ่งที่มักพลาด
ปลั๊กอินเขียนทับฐานข้อมูล เครื่องมือ offload บางตัวใช้วิธีค้นหาและแทนที่
ทั่วตาราง wp_posts เพื่อชี้ URL ไปที่บักเก็ต ซึ่งใช้ได้จริง
จนกระทั่งวันที่คุณถอดปลั๊กอินหรือเปลี่ยนบักเก็ต แล้วพบว่าเนื้อหาของคุณ
เต็มไปด้วย URL ที่ชี้ไปยังที่ที่ไม่มีอยู่แล้ว
ย้ายได้ทางเดียว ถ้าเครื่องมือไม่มีทางดึงไฟล์กลับ เท่ากับคุณฝากคลังสื่อไว้กับ ผู้ขายรายหนึ่งและบักเก็ตหนึ่งใบ วันที่ยกเลิกอย่างใดอย่างหนึ่ง มันจะกลายเป็นงานกู้ข้อมูล
ไม่มีการตรวจสอบว่าไฟล์ที่คัดลอกไปครบ อัปโหลด ลบไฟล์ในเครื่อง แล้วภาวนา ถ้าอัปโหลดขาดกลางคัน ต้นฉบับก็หายถาวร
ลำดับที่ปลอดภัยจริง
การย้ายควรมีสี่ขั้นตอน ตามลำดับนี้
- คัดลอก อัปโหลดขึ้นบักเก็ต ยังไม่แตะไฟล์ในเครื่อง ถ้าสะดุดกลางคันจึงไม่มีอะไรเปลี่ยน
- ตรวจสอบ เทียบ checksum ระหว่างไฟล์บนคลาวด์กับไฟล์ต้นทาง ถ้าไม่ตรงให้หยุด เพราะต้นฉบับยังอยู่ครบ
- ปล่อยพื้นที่ ต่อเมื่อตรงกันทุกไบต์เท่านั้น จึงลบไฟล์ในเครื่อง แล้วบันทึกตำแหน่งใหม่
- ย้อนกลับได้ตลอด ดึงไฟล์กลับมาที่เซิร์ฟเวอร์เมื่อไรก็ได้ เหมือนเดิมทุกไบต์
MediaDock Pro ทำตามลำดับนี้เป๊ะ ๆ จะทำทีละโฟลเดอร์หรือทั้งคลังก็ได้ และไม่เขียนทับฐานข้อมูลของคุณเลย การสลับ URL เกิดตอนเรนเดอร์หน้าโดยอ่านจาก แม็ปที่แคชไว้ ด้วยเหตุนี้การถอดปลั๊กอินจึงไม่มีทางทิ้งลิงก์เสีย เพราะเนื้อหาในฐานข้อมูลของคุณชี้มาที่เว็บตัวเองมาตลอด
วิธีตั้งค่า
สรุปสั้น ๆ
- สร้างบักเก็ต R2 ในแดชบอร์ด Cloudflare
- สร้าง API token ที่จำกัดสิทธิ์เฉพาะบักเก็ตนั้น แบบ Object Read & Write
- เชื่อมโดเมนของตัวเอง (หรือเปิดซับโดเมน r2.dev) เพื่อให้ไฟล์เข้าถึงได้จากภายนอก
- ใน WordPress เพิ่ม storage location วาง endpoint กับชื่อบักเก็ต
และเก็บคีย์ไว้ใน
wp-config.phpแทนที่จะเก็บในฐานข้อมูล - กดทดสอบการเชื่อมต่อ แล้วลองย้ายทีละโฟลเดอร์ก่อนย้ายทั้งหมด
ขั้นตอนละเอียดพร้อมค่าคงที่ที่ต้องใส่ อยู่ใน คู่มือย้ายไฟล์ขึ้นคลาวด์
สิ่งที่ควรวัดหลังทำเสร็จ
- พื้นที่ดิสก์บนเซิร์ฟเวอร์ ควรลดลงประมาณเท่ากับขนาดที่ย้ายไป ถ้าไม่ลด แปลว่าไฟล์ถูกคัดลอกไปแล้วแต่ยังไม่ถูกปล่อยพื้นที่
- เวลาเรนเดอร์หน้า ไม่ควรเปลี่ยน การสลับ URL จากแม็ปที่แคชไว้แทบไม่มีต้นทุน ในการวัดผลของเรา หน้าที่มีภาพจากคลาวด์ 20 รูปเรนเดอร์ทั้งหน้าใน 47 มิลลิวินาที โดยไม่เพิ่มคิวรีฐานข้อมูลเลย
- ค่า egress ของบักเก็ต สำหรับผู้ให้บริการที่คิดเงินส่วนนี้ ตัวเลขนี้คือคำตอบว่าการเลือก R2 คุ้มหรือไม่
คุณจำเป็นต้องทำจริงไหม
ถ้าคลังสื่อของคุณมีขนาดไม่กี่กิกะไบต์ และโฮสต์ให้พื้นที่มาเหลือเฟือ การย้ายขึ้นคลาวด์ก็แทบไม่ได้อะไร มันเริ่มคุ้มเมื่อค่าพื้นที่กลายเป็นรายจ่ายจริงจัง เมื่อการสำรองข้อมูลช้าจนคุณเริ่มข้ามมัน หรือเมื่อคุณอยากให้ไฟล์สื่อถูกเสิร์ฟ จากที่ที่ใกล้ผู้ชมมากกว่าเซิร์ฟเวอร์ต้นทางเครื่องเดียว
ลองกับคลังสื่อของคุณเอง
MediaDock เพิ่มโฟลเดอร์ให้คลังสื่อ WordPress และในรุ่น Pro ยังย้ายไฟล์ของคุณขึ้น Cloudflare R2 หรือคลาวด์ที่รองรับ S3 ได้ด้วย มีเวอร์ชันฟรีบน WordPress.org