ทุกครั้งที่มีคนเปิดหน้าบน
ถ้าทำดี นี่คือหนึ่งในวิธีเพิ่มความเร็ว ที่ลงทุนน้อยที่สุด ถ้าทำไม่ดี
คำตอบ สั้น ๆ
- การแคช
เว็บไซต์ คือการเก็บสำเนาสำเร็จรูปของไฟล์ หน้าเว็บ หรือผลลัพธ์จากฐานข้อมูล เพื่อไม่ต้องดึงหรือสร้าง ใหม่อีก - มีสี่ชั้นที่สำคัญ คือ แคชของเบราว์เซอร์บนอุปกรณ์ของ
ผู้เข้าชม CDN ที่อยู่ใกล้ผู้เข้าชม แคชหน้าเว็บ (page cache) บนเซิร์ฟเวอร์ของคุณ และ object cache ที่อยู่ถัดเข้าไปอีกชั้น - แคชสิ่งที่เหมือนกันสำหรับทุกคน ห้ามแคชตะกร้า หน้าชำระเงิน พื้นที่บัญชี
ผู้ใช้ หน้าที่แสดงตอนล็อกอิน หรือเนื้อหาเฉพาะบุคคล - คุณต้องใช้ CDN เมื่อ
ผู้เข้าชม อยู่ไกลจากเซิร์ฟเวอร์ กระจายอยู่หลายภูมิภาค หรือเข้ามาพร้อมกันเป็นช่วง ๆ - แก้แล้วไม่เห็นผล? มีสำเนาเก่าเก็บอยู่ที่ไหนสักแห่ง ให้ล้างแคช จากเซิร์ฟเวอร์ไล่ออกมาด้านนอก
แคชเว็บไซต์ ทั้งสี่ชั้น
แต่ละชั้นตอบคำขอแทนเซิร์ฟเวอร์ของคุณ และยิ่งอยู่ใกล้
| ชั้น | อยู่ที่ไหน | เก็บอะไร | ล้างอย่างไร |
|---|---|---|---|
| แคชของเบราว์เซอร์ | อุปกรณ์ของ |
รูปภาพ CSS JavaScript ฟอนต์ | หมดอายุ หรือไฟล์ได้ที่อยู่ใหม่ |
| CDN | เซิร์ฟเวอร์ที่อยู่ใกล้ |
ไฟล์ static บางครั้งทั้งหน้า | สั่ง purge ใน CDN |
| Page cache | เว็บเซิร์ฟเวอร์ของคุณ | หน้า HTML ที่ |
สั่ง purge ในปลั๊กอินหรือแผงควบคุม |
| Object cache | หน่วยความจำของเซิร์ฟเวอร์ | ผลลัพธ์ query |
สั่ง flush ในปลั๊กอิน |
แคชของเบราว์เซอร์: สำเนาของผู้เข้าชม
ในการเข้าชมครั้งแรก เบราว์เซอร์จะดาวน์โหลดโลโก้ สไตล์ชีต สคริปต์ และฟอนต์ของคุณ ส่วน header แบบ cache-control จากเซิร์ฟเวอร์ บอกเบราว์เซอร์ว่า จะเก็บไฟล์ไว้ใช้กับหน้า
max-age=31536000ทำให้ไฟล์ถือว่ายังใหม่ (fresh) อยู่หนึ่งปี (ค่าเป็นวินาที) การเพิ่มimmutableบอกว่าไฟล์จะไม่เปลี่ยน ตราบที่สำเนานั้นยังใหม่อยู่ เบราว์เซอร์จึงไม่ต้องเช็ก ซ้ำตอนรีโหลด no-cacheมักถูกเข้าใจผิด ค่านี้อนุญาตให้เก็บ แต่เบราว์เซอร์ต้องเช็ก กับเซิร์ฟเวอร์ ก่อนนำมาใช้ซ้ำทุกครั้ง no-storeหมายถึงห้ามเก็บสำเนาเลย ส่วนprivateกันไม่ให้ response ไปอยู่ในแคชที่ใช้ร่วมกัน เช่น CDN
กฎการใส่เวอร์ชัน อายุแคชที่ยาว ปลอดภัยก็ต่อเมื่อที่อยู่ของไฟล์ เปลี่ยนทุกครั้งที่ไฟล์เปลี่ยน นี่คือเหตุผลที่ WordPress เติมเลข ?ver= ให้สไตล์ชีตและสคริปต์ของธีมและปลั๊กอิน ซึ่งใช้ได้ ตราบที่เลขนั้นเพิ่มขึ้น ทุกครั้งที่มีการเปลี่ยนแปลง no-cache เพื่อให้
ลองตรวจเอง ใน Chrome DevTools เปิดแผง Network ตรวจว่าไม่ได้ติ๊ก “Disable cache” แล้วcache-control ของไฟล์นั้น
Service worker ไปได้ไกลกว่านั้น คือเก็บทั้งหน้าไว้ใช้แบบ
CDN: สำเนาใกล้ผู้เข้าชม
CDN คืออะไร? CDN ย่อมาจาก content delivery network คือกลุ่มเซิร์ฟเวอร์ ในหลาย
ระยะทางสำคัญ เพราะการเปิดการ
- เฉพาะไฟล์ static CDN ส่งรูปภาพ CSS สคริปต์ และฟอนต์ ส่วนเซิร์ฟเวอร์ของคุณยัง
สร้าง ทุกหน้าเอง ความเสี่ยงต่ำ แต่ HTML ยังต้องเดินทาง ไกลอยู่ - แคชทั้งหน้า (full-page caching) CDN เก็บ HTML ด้วย
ผู้เข้าชม ส่วนใหญ่ จึงไม่ต้องไปถึงเซิร์ฟเวอร์ของคุณเลย ลดเวลาจนถึงไบต์แรก (TTFB) ได้มากที่สุด แต่ต้องมีกฎให้ข้ามแคช สำหรับผู้เข้าชม ที่ล็อกอิน ตะกร้า และหน้าชำระเงิน CDN หลายเจ้า ทำแบบนี้ก็ต่อเมื่อคุณเปิดใช้งาน
Page cache: หน้าสำเร็จรูปบนเซิร์ฟเวอร์
Page cache เก็บ HTML ที่
Page cache มาได้จากปลั๊กอินแคช
มีสองพฤติกรรมที่ทำให้เจ้าของเว็บแปลกใจ หลังล้างแคชทั้งหมด แคชจะว่าง (cold)
Object cache: เรียกฐานข้อมูล น้อยลง
Object cache เก็บผลลัพธ์ query
Object cache ช่วยในจุดที่ page cache ช่วยไม่ได้ คือ
สิ่งที่ห้ามแคช
แคชสิ่งที่เหมือนกันทุก
แคชรู้จักหน้าเหล่านี้ ผ่านการยกเว้น URL คุกกี้ และ header ตอนล็อกอิน WordPress จะตั้งคุกกี้ที่wordpress_logged_in_ และปลั๊กอินแคช
ทดสอบความ
โทเค็น ความปลอดภัยหมดอายุแบบฟอร์ม บางตัวฝังโทเค็น ความปลอดภัยของ WordPress (nonce) ซึ่งโดยค่าเริ่มต้น จะหมดอายุ 12 ถึง 24 ชั่วโมงหลังถูกสร้าง ขึ้น ถ้าแคชหน้านานกว่าประมาณ 12 ชั่วโมงแบบฟอร์ม อาจใช้ไม่ได้ ให้ตั้งอายุแคชให้สั้นกว่านั้น หรือใช้แบบฟอร์ม ที่ดึงโทเค็น ใหม่เอง- ภาษาหรือ
สกุลเงิน ที่สลับด้วยคุกกี้ URL แยกตามภาษา แคชได้โดยไม่มีปัญหา แต่ถ้าคุกกี้เป็นตัวสลับภาษาหรือสกุลเงิน บน URL เดียวกัน แคชต้องแยกตามคุกกี้นั้นด้วย ไม่อย่างนั้นผู้เข้าชม จะได้เวอร์ชันไหนก็ตาม ที่ถูกเก็บไว้ก่อน
ลองตรวจเอง ใส่สินค้าลงตะกร้า แล้วเปิดหน้าตะกร้าใน
ต้องใช้ CDN ไหม?
ขึ้นอยู่กับว่า
| สถานการณ์ของคุณ | CDN ช่วยได้แค่ไหน |
|---|---|
| ลูกค้าอยู่ประเทศหลักประเทศเดียว |
ช่วยเรื่องความเร็วไม่มาก แต่ประโยชน์ |
| ช่วยมาก โดยเฉพาะกับการแคชทั้งหน้า | |
| ช่วยมาก หน้าที่แคชไว้รับ |
|
| ช่วยมาก | |
| หน้า |
ช่วยหน้าเว็บได้น้อยกว่า แต่ยังมีประโยชน์กับไฟล์ |
ลองตรวจเอง ดูใน Google Analytics ว่า
ประโยชน์ข้างเคียง และข้อควรระวัง
- จัดการ HTTPS ให้ CDN หลายเจ้าออกและต่ออายุ
ใบรับรอง TLS ให้อัตโนมัติ และรองรับโปรโตคอลใหม่ ๆ เช่น HTTP/3 ป้องกัน ทราฟฟิก ท่วมเครือข่าย ขนาดใหญ่ รับทราฟฟิก ที่จะทำให้เซิร์ฟเวอร์เดียวล่มได้ และมักมีการป้องกัน denial-of-service ขั้นพื้นฐาน มาด้วย ซึ่งเป็นส่วนเสริม ไม่ได้แทนพื้นฐาน ใน คู่มือความปลอดภัย WordPress- ลดภาระ
โฮสติ้ง CDN บางเจ้ายังส่งหน้าที่แคชไว้ต่อไปได้ระหว่าง ที่เซิร์ฟเวอร์ของคุณล่มชั่วคราว
ข้อควรระวังคือ CDN เป็นอีกชั้นที่ต้อง
ทำไมแก้แล้วไม่เห็นผล?
คุณบันทึกหน้าแล้ว แต่เวอร์ชันเก่ายังแสดงอยู่ ไม่ว่าจะสำหรับคุณหรือเพื่อนร่วมงาน แปลว่ามีแคชกำลังส่งสำเนาเก่า การลบสำเนานั้นเรียกว่า purge
ล้างแคชเว็บไซต์ ตามลำดับที่ถูกต้อง
ล้างจากเซิร์ฟเวอร์ไล่ออกมาด้านนอก เพราะแต่ละชั้นเติมสำเนา จากชั้นที่อยู่ข้างหลัง ถ้า purge CDN ก่อน CDN อาจดึงหน้าเก่า กลับมาจาก page cache ของคุณทันที
- Object cache เฉพาะเมื่อการเปลี่ยนเมนู widget หรือการ
ตั้งค่า ดูเหมือนค้างอยู่ - Page cache ในปลั๊กอินแคช หรือแผงควบคุม
โฮสติ้ง - CDN สำหรับ URL ที่เปลี่ยน หรือทั้งหมด หลังเปลี่ยน
ดีไซน์ - เบราว์เซอร์ของคุณ ด้วยการ hard reload (Ctrl+Shift+R หรือ Cmd+Shift+R บน Mac ในเบราว์เซอร์
ส่วนใหญ่ ) หรือหน้าต่าง ส่วนตัว ข้อนี้มีผลแค่กับเบราว์เซอร์ของคุณเอง
อาการ สาเหตุ และวิธีแก้
| สิ่งที่เห็น | ชั้นที่น่าจะเป็นสาเหตุ | วิธีแก้ |
|---|---|---|
| เห็นการเปลี่ยนแปลงตอนล็อกอิน แต่ไม่เห็นใน |
Page cache | purge แล้ว |
| คุณเห็น แต่เพื่อนร่วมงานที่อยู่อีกที่ไม่เห็น | เบราว์เซอร์ของเขา หรือ CDN จุดใดจุดหนึ่ง | hard reload แล้ว purge URL นั้นบน CDN |
| CSS ถูกแคชไว้ที่ที่อยู่เดิม | ตรวจให้แน่ใจว่าเลขเวอร์ชันของไฟล์เปลี่ยน | |
| รูปที่เปลี่ยนแล้ว ยังแสดงรูปเก่า | แคชของ URL รูปนั้นอายุยาว |
การป้องกันดีกว่าการ purge การ
คำถาม ที่พบบ่อย
CDN กับเว็บโฮสติ้ง เหมือนกันไหม?
ไม่ใช่
แคชเว็บไซต์ ช่วย SEO ไหม?
ช่วย
ใช้ปลั๊กอินแคชสองตัวพร้อมกันได้ไหม?
ไม่ได้ page cache สองตัวจะขัดกัน และทำให้หา
ขั้นตอน ต่อไป
การ
คู่มือเพิ่มความเร็ว
ไม่แน่ใจว่าหน้าของคุณถูกส่งจากแคชหรือไม่ หรือ CDN จะ