Cache và kết nối tốt giúp WordPress gửi đúng phiên bản nội dung bằng ít công việc và ít vòng chờ hơn. Tài nguyên đã gắn phiên bản có thể cache dài hạn, HTML và API cần chính sách riêng, còn trang đăng nhập, giỏ hàng, thanh toán hoặc nội dung cá nhân hóa phải được loại khỏi page cache công khai.
Bài thứ 16 trong series SEO WordPress chuyển 10 tiêu chí từ 124 đến 133 thành quy trình kiểm tra được: Cache-Control, page cache, webfont, resource hints, phiên bản hóa, validator, purge cache, tái sử dụng kết nối, giảm số origin và chống cache stampede.
Nguyên tắc: cache đúng dữ liệu, đúng lớp và đúng thời gian; kết nối sớm chỉ tới origin thật sự quan trọng.
1. Cache và kết nối ảnh hưởng SEO WordPress như thế nào?
Cache giảm thời gian tái tạo và truyền lại dữ liệu, còn tối ưu kết nối giảm chi phí DNS, TCP, TLS và thời gian chờ request. Hai nhóm kỹ thuật này có thể cải thiện TTFB, tốc độ tải tài nguyên, độ ổn định khi traffic tăng và trải nghiệm quay lại trang.
Cache không phải một hộp duy nhất. Trình duyệt có HTTP cache; CDN có edge cache; reverse proxy hoặc web server có page cache; WordPress có object cache; PHP có opcode cache. Một URL có thể đi qua nhiều lớp trước khi tới database. Vì vậy, câu “đã bật cache” chưa đủ để kết luận.
| Lớp | Lưu gì? | Mục tiêu | Rủi ro chính |
|---|---|---|---|
| Browser cache | CSS, JavaScript, font, ảnh, đôi khi HTML | Không tải lại byte đã có | Giữ bản cũ nếu URL không đổi |
| CDN cache | Tài nguyên tĩnh và HTML công khai | Phục vụ gần người dùng | Cache nhầm nội dung cá nhân hóa |
| Page cache | HTML đã render | Bỏ qua PHP và truy vấn lặp lại | Trang động bị phục vụ sai người |
| Object cache | Kết quả truy vấn, option, object | Giảm truy cập database | Invalidation thiếu chính xác |
| Opcode cache | Mã PHP đã biên dịch | Giảm chi phí biên dịch PHP | Cấu hình bộ nhớ không phù hợp |
Hiệu năng là kết quả của cả chuỗi. Page cache nhanh không bù được ảnh lớn từ năm origin khác nhau; HTTP/3 không sửa được HTML mất ba giây để sinh; cache một năm không an toàn nếu file CSS thay nội dung mà không đổi URL.
2. Bản đồ kiểm tra 10 tiêu chí từ 124 đến 133
Mười tiêu chí chia thành bốn nhóm: chính sách cache, cache phía máy chủ, tải tài nguyên đầu trang và quản trị kết nối. Nên kiểm từ response header và waterfall thực tế, không chỉ dựa vào trạng thái “ON” trong plugin.
| Mã | Tiêu chí | Dấu hiệu đạt | Trọng số |
|---|---|---|---|
| 124 | Cache-Control tài nguyên tĩnh | File phiên bản hóa cache dài hạn; HTML và dữ liệu riêng có chính sách riêng | Bắt buộc |
| 125 | Page cache phía máy chủ | Trang công khai có HIT và TTFB giảm rõ | Bắt buộc |
| 126 | Tải Webfont | WOFF2, preload có chọn lọc, font-display phù hợp | Quan trọng |
| 127 | Preconnect và DNS-prefetch | Chỉ khai báo origin quan trọng chắc chắn dùng | Nên có |
| 128 | Phiên bản hóa tài nguyên | URL đổi khi nội dung file đổi | Bắt buộc |
| 129 | ETag hoặc Last-Modified | Yêu cầu có điều kiện trả 304 khi phù hợp | Quan trọng |
| 130 | Purge cache | Xóa đúng lớp, đúng URL và xác minh bản mới | Bắt buộc |
| 131 | Tái sử dụng kết nối | Request cùng origin dùng kết nối và multiplexing hiệu quả | Quan trọng |
| 132 | Giảm số nguồn kết nối | Ít origin hơn, mỗi origin có giá trị đo được | Quan trọng |
| 133 | Warm cache và chống stampede | URL ưu tiên được làm ấm, cache miss đồng thời được điều phối | Nên có |
Mỗi tiêu chí cần ba bằng chứng: cấu hình dự kiến, response hoặc waterfall thực tế và kết quả trước sau trong cùng điều kiện. Nếu thiếu một lớp, audit dễ kết luận theo tên plugin thay vì hành vi thật.
3. Tiêu chí 124: Cache-Control cho tài nguyên tĩnh
Tài nguyên tĩnh đã phiên bản hóa có thể dùng Cache-Control: public, max-age=31536000, immutable, nhưng HTML, API và nội dung riêng tư cần chính sách riêng. Một năm chỉ an toàn khi URL thay đổi mỗi lần nội dung thay đổi, nhờ vậy bản mới và bản cũ không dùng chung cache key.
Cache-Control: public, max-age=31536000, immutableMDN HTTP Caching trình bày mẫu cache dài hạn cho tài nguyên có version và giải thích no-cache không có nghĩa là cấm lưu. Nó cho phép lưu nhưng yêu cầu xác thực lại trước khi dùng. no-store mới là chỉ thị không lưu response.
| Loại response | Chính sách thường phù hợp | Lý do |
|---|---|---|
| CSS, JS có content hash | public, max-age=31536000, immutable | URL mới khi byte thay đổi |
| Ảnh có tên phiên bản | Cache dài hạn | Ít thay đổi, có cache busting |
| HTML công khai | TTL ngắn, no-cache hoặc CDN cache có purge | Cần thấy nội dung mới |
| API công khai | Theo độ tươi và hợp đồng dữ liệu | Không có một TTL chung |
| Trang theo người dùng | private, thường kèm no-cache hoặc no-store | Không chia sẻ response giữa người dùng |
Kiểm cả browser cache và CDN cache. Header s-maxage có thể điều khiển shared cache khác với max-age cho trình duyệt. Header Vary cũng có thể làm cache key phân mảnh hoặc trộn sai biến thể nếu cấu hình thiếu.
Trọng số: Bắt buộc. Công cụ: Chrome DevTools, cURL, WebPageTest và Website Performance Test của Novaverb.
4. Phân loại response trước khi đặt thời gian cache
TTL phải đi sau việc phân loại khả năng thay đổi, mức riêng tư và cơ chế invalidation của từng response. Không nên sao chép cùng một header cho toàn bộ website chỉ vì một bài kiểm tra yêu cầu “cache lâu hơn”.
- Xác định response là tài nguyên tĩnh, HTML, API hay dữ liệu theo phiên.
- Xác định response có thể được dùng chung giữa nhiều người hay không.
- Xác định URL có đổi khi nội dung đổi hay không.
- Xác định lớp nào đang lưu: browser, CDN, reverse proxy hay plugin.
- Xác định cách purge hoặc revalidate khi dữ liệu thay đổi.
- Đặt TTL theo độ tươi chấp nhận được, không theo một con số chung.
- Kiểm response có
Set-Cookie,AuthorizationhoặcVaryảnh hưởng cache key không.
Một file app.8c72.css có thể cache một năm. Một URL /style.css bị ghi đè mỗi lần deploy thì không nên dùng immutable nếu chưa có versioning. HTML trang tin có thể cache vài phút ở edge và purge khi xuất bản, còn trang tài khoản cần tách khỏi shared cache.
Câu hỏi quyết định: nếu response cũ được dùng lại đến hết TTL, điều gì sẽ xảy ra và có cơ chế nào buộc URL hoặc cache entry đổi đúng lúc không?
5. Tiêu chí 125: Page Cache phía máy chủ
Trang công khai có thể cache nên được phục vụ từ page cache để tránh lặp lại toàn bộ chuỗi PHP, theme, plugin và database cho mỗi lượt xem. Tài liệu WordPress Advanced Administration Handbook về Cache giải thích plugin cache có thể lưu bài và trang thành file tĩnh để giảm tải xử lý phía máy chủ.
Page cache khác object cache. Page cache giữ HTML hoàn chỉnh; object cache giữ dữ liệu trung gian để WordPress vẫn render trang nhưng ít truy vấn hơn. Website có Redis không đồng nghĩa đã có full-page cache, và CDN lưu ảnh không đồng nghĩa đang cache HTML.
- Cache trang bài viết, landing page, danh mục công khai và trang chủ nếu nội dung không cá nhân hóa.
- Loại trừ
/wp-admin/, đăng nhập và preview. - Loại trừ giỏ hàng, thanh toán, tài khoản và endpoint theo phiên.
- Không cache response có dữ liệu người dùng chỉ bằng cách bỏ cookie khỏi giao diện.
- Kiểm mobile và desktop có dùng cùng HTML hay cần biến thể cache key.
- Kiểm query string nào được giữ, bỏ hoặc tạo cache entry riêng.
WP Rocket, LiteSpeed Cache hoặc lớp server cache có thể thực hiện page cache, nhưng bằng chứng phải là response thật: Age, X-Cache, CF-Cache-Status, X-LiteSpeed-Cache hoặc header tương đương. Tên header phụ thuộc stack.
Trọng số: Bắt buộc. Công cụ: WP Rocket, LiteSpeed Cache, Query Monitor, cURL và Server Response Time Checker của Novaverb.
6. Cách xác minh Cache HIT và TTFB giảm thật
Đo ít nhất một request lạnh và nhiều request ấm trong cùng điều kiện, rồi so median TTFB cùng trạng thái HIT, MISS hoặc BYPASS. Một request nhanh duy nhất có thể do route đã ấm, mạng thuận lợi hoặc response đang ở CDN gần vị trí đo.
curl -s -o /dev/null -D - https://example.com/bai-viet/
curl -s -o /dev/null -w "%{http_code} %{time_starttransfer}\n" https://example.com/bai-viet/- Xóa hoặc bỏ qua browser cache để đo mạng rõ ràng.
- Gửi request đầu tiên và ghi trạng thái cache, TTFB, status code.
- Gửi lại ít nhất ba lần từ cùng vị trí.
- Dùng trung vị thay vì chọn lần có thời gian thấp nhất.
- Thử URL có cookie đăng nhập và URL ẩn danh.
- Thử trang được phép cache và trang bắt buộc bypass.
- Kiểm HTML của hai người dùng không bị trộn.
Mục tiêu là TTFB giảm rõ trên HIT và origin không phải tái tạo trang cho mọi request. Nếu header báo HIT nhưng TTFB vẫn cao, cần kiểm khoảng cách tới edge, TLS, worker tại CDN, response lớn hoặc chain redirect. Nếu TTFB nhanh nhưng header luôn MISS, cache key có thể bị phân mảnh bởi cookie hoặc query string.
7. Tiêu chí 126: Tối ưu tải Webfont
Chỉ tải font, weight và subset thật sự dùng; ưu tiên WOFF2, preload font quan trọng cho vùng đầu trang và chọn font-display theo trải nghiệm mong muốn. Font có thể bị phát hiện muộn vì trình duyệt phải tải CSS và dựng CSSOM trước khi biết biến thể nào cần dùng.
web.dev về tối ưu Webfont lưu ý preload cần dùng có chọn lọc, font là tài nguyên CORS nên preload thường cần crossorigin kể cả khi tự host. Preload quá nhiều weight làm chúng cạnh tranh với CSS, ảnh LCP và script quan trọng.
<link rel="preload" href="/fonts/site-regular.woff2"
as="font" type="font/woff2" crossorigin>
@font-face {
font-family: "Site Sans";
src: url("/fonts/site-regular.woff2") format("woff2");
font-weight: 400;
font-style: normal;
font-display: swap;
}- Dùng WOFF2 cho trình duyệt hiện đại.
- Chỉ preload font xuất hiện chắc chắn trong viewport đầu.
- Không preload mọi weight 300 đến 900.
- Dùng variable font khi tổng payload thực sự nhỏ hơn các file tách.
- Subset theo hệ chữ nhưng không làm thiếu ký tự tiếng Việt.
- So metric của fallback để hạn chế dịch chuyển khi swap.
- Cân nhắc
optionalkhi ưu tiên tốc độ và chấp nhận giữ fallback trong lần tải đầu.
Trọng số: Quan trọng. Công cụ: Chrome DevTools, PageSpeed Insights và PageSpeed Checker của Novaverb.
8. Tiêu chí 127: Preconnect và DNS-prefetch đúng chỗ
preconnect chỉ nên dành cho origin bên thứ ba quan trọng chắc chắn được dùng sớm; dns-prefetch là gợi ý nhẹ hơn khi chỉ muốn phân giải DNS trước. Preconnect có thể thực hiện DNS, TCP và TLS trước khi request tài nguyên xuất hiện.
MDN về rel=preconnect cảnh báo preconnect tới quá nhiều domain có thể phản tác dụng. Kết nối không dùng vẫn tiêu tốn socket, CPU, TLS và băng thông cạnh tranh với tài nguyên quan trọng.
<link rel="preconnect" href="https://fonts.example-cdn.com" crossorigin>
<link rel="dns-prefetch" href="https://analytics.example.com">| Tình huống | Gợi ý | Không nên làm |
|---|---|---|
| Font bên ngoài dùng ngay đầu trang | Preconnect đúng origin và đúng CORS mode | Khai báo domain stylesheet nhưng bỏ domain file font |
| Analytics tải sau consent | DNS-prefetch hoặc không hint trước khi cần | Preconnect mọi nhà cung cấp marketing |
| Tài nguyên cùng origin | Không cần preconnect | Preconnect chính website đang mở |
| Video chỉ tải khi bấm | Kết nối sau tương tác | Mở kết nối từ đầu cho mọi embed |
Trọng số: Nên có. Công cụ: Chrome DevTools Network, WebPageTest và Website Performance Test của Novaverb.
9. Tiêu chí 128: Phiên bản hóa tài nguyên tĩnh
URL của CSS, JavaScript, font hoặc ảnh phải thay đổi khi nội dung file thay đổi để cache dài hạn không giữ bản cũ. Có thể dùng content hash trong tên file, build hash trong manifest hoặc tham số phiên bản được cập nhật nhất quán.
/assets/app.8c72f1.css
/assets/site.4b109e.js
/fonts/site-regular.v3.woff2
wp_enqueue_style('theme', $url, [], '2026.09.06');Content hash đáng tin hơn version viết tay vì URL chỉ đổi khi byte thực sự đổi. Tham số ?ver= vẫn có thể hoạt động với browser cache và nhiều CDN, nhưng cần kiểm CDN có giữ query string trong cache key không. Không dùng ngày hiện tại hoặc số ngẫu nhiên cho mọi request vì nó phá tái sử dụng cache.
- Đổi URL khi nội dung đổi.
- Giữ URL ổn định khi nội dung không đổi.
- Đưa file mới lên trước khi HTML bắt đầu tham chiếu tới nó.
- Giữ file hash cũ đủ lâu cho HTML cũ còn trong cache.
- Không purge toàn CDN để bù cho quy trình versioning thiếu.
- Kiểm service worker có cache riêng và cần nâng version không.
Trong WordPress, theme hoặc plugin có thể dùng phiên bản plugin làm version. Khi chỉnh CSS trực tiếp mà không tăng version, trình duyệt vẫn có thể giữ file cũ. Asset manifest của bundler giúp template đọc đúng tên hash thay vì ghép chuỗi thủ công.
Trọng số: Bắt buộc. Công cụ: Chrome DevTools, Asset Manifest, cURL và PageSpeed Checker của Novaverb.
10. Tiêu chí 129: Xác thực lại bằng ETag hoặc Last-Modified
Tài nguyên không immutable nên có validator như ETag hoặc Last-Modified để yêu cầu có điều kiện nhận 304 khi representation chưa đổi. Validator tiết kiệm payload nhưng vẫn có một lượt kết nối và kiểm tra với server. Vì vậy, revalidation không miễn phí và cần được đặt đúng nơi trong toàn bộ chiến lược cache của website.
MDN về ETag mô tả ETag là định danh cho một phiên bản cụ thể của tài nguyên. Client gửi lại If-None-Match; server trả 304 nếu phiên bản còn nguyên hoặc 200 với nội dung mới nếu đã đổi.
ETag: "33a64df5"
Last-Modified: Sat, 06 Sep 2026 02:30:00 GMT
Cache-Control: no-cache
If-None-Match: "33a64df5"
If-Modified-Since: Sat, 06 Sep 2026 02:30:00 GMTETag phải nhất quán giữa các node phục vụ cùng representation. Nếu mỗi origin sinh ETag khác nhau cho cùng byte, request qua load balancer sẽ liên tục nhận 200. CDN có thể biến đổi nén hoặc response và sửa ETag, vì vậy cần kiểm header người dùng cuối nhận được, không chỉ header tại origin.
- Kiểm request lần hai có gửi
If-None-MatchhoặcIf-Modified-Since. - Kiểm 304 không gửi lại toàn bộ body.
- Kiểm ETag đổi khi nội dung đổi.
- Không dùng validator để thay versioning cho asset immutable.
- Kiểm
Last-Modifiedkhông mới hơn thời gian response.
Trọng số: Quan trọng. Công cụ: Chrome DevTools, cURL, WebPageTest và Website Performance Test của Novaverb.
11. Tiêu chí 130: Purge Cache sau khi triển khai
Sau khi đổi nội dung, theme, plugin hoặc cấu hình, chỉ purge cache entry và lớp bị ảnh hưởng rồi xác minh response mới đã tới người dùng. Purge toàn bộ mọi lớp là thao tác dễ làm nhưng có thể tạo tải đột biến và làm mất lợi ích cache trên hàng nghìn URL không đổi.
| Thay đổi | Purge tối thiểu cần xem xét | Xác minh |
|---|---|---|
| Sửa một bài viết | URL bài, trang danh mục, sitemap hoặc feed liên quan | Title, nội dung và modified time mới |
| Đổi CSS có hash | Không cần purge asset cũ; cập nhật HTML tham chiếu | HTML gọi đúng file hash mới |
| Đổi menu sitewide | Các trang HTML dùng menu hoặc fragment cache | Mẫu trang ở nhiều cache node |
| Đổi plugin cache | Page cache, object cache theo hướng dẫn stack | Không còn entry không tương thích |
| Đổi API dữ liệu | Endpoint và consumer cache liên quan | Schema, status và payload mới |
Quy trình deploy tốt tạo asset version mới trước, chuyển HTML sang URL mới, rồi dọn file cũ sau khi HTML cũ hết khả năng được dùng. Cách này tránh khoảng thời gian HTML đang sống trỏ vào file đã bị xóa.
Trọng số: Bắt buộc. Công cụ: CDN Dashboard, Cache Plugin, cURL và Server Response Time Checker của Novaverb.
12. Thứ tự purge khi WordPress có nhiều lớp Cache
Purge cần đi từ lớp tạo dữ liệu tới lớp phân phối dữ liệu và phải có kế hoạch làm ấm sau đó. Nếu chỉ xóa CDN nhưng page cache tại origin còn cũ, edge sẽ lấy lại đúng bản cũ. Nếu chỉ xóa page cache nhưng CDN còn HIT, người dùng chưa thấy thay đổi.
- Xác định nguồn sự thật đã cập nhật thành công.
- Xóa object hoặc fragment cache liên quan nếu dữ liệu trung gian đã đổi.
- Xóa page cache của URL và các trang tổng hợp phụ thuộc.
- Purge CDN cache theo URL, tag hoặc surrogate key.
- Cập nhật service worker cache nếu ứng dụng có dùng.
- Gửi request ẩn danh để làm ấm URL ưu tiên.
- Kiểm response header và nội dung từ ít nhất hai vị trí nếu CDN phân tán.
- Kiểm người dùng đăng nhập và giỏ hàng vẫn bypass đúng.
Nên ghi lại ai purge, thời điểm, lý do, phạm vi URL và kết quả xác minh. Đây là dữ liệu quan trọng khi một thay đổi chỉ xuất hiện ở vài thiết bị hoặc vài khu vực. Không dùng hard refresh trên máy cá nhân làm bằng chứng duy nhất.
Điều kiện dừng: phiên bản mới xuất hiện đúng ở cache công khai, trang riêng tư không bị cache và tỷ lệ lỗi hoặc tải origin không tăng bất thường.
13. Tiêu chí 131: Tái sử dụng kết nối với HTTP/2 và HTTP/3
Các request cùng origin nên tái sử dụng kết nối và tận dụng multiplexing của HTTP/2 hoặc HTTP/3 thay vì mở lại DNS, TCP và TLS cho từng file. HTTP/2 cho phép nhiều trao đổi đồng thời trên một kết nối; HTTP/3 dùng QUIC với nhiều stream và cơ chế thiết lập kết nối khác.
RFC 9113 về HTTP/2 nêu rõ HTTP/2 không dùng header Connection để báo metadata riêng cho kết nối. MDN về Connection cũng cảnh báo Connection và Keep-Alive không được dùng trong HTTP/2 và HTTP/3.
- Xem cột Protocol trong Network để phân biệt h2, h3 và HTTP/1.1.
- Xem Connection ID hoặc remote address để nhận biết request có dùng chung kết nối.
- Không thêm
Connection: keep-alivenhư mẹo tối ưu cho h2 hoặc h3. - Kiểm redirect sang host khác có làm mở thêm kết nối không.
- Kiểm chứng chỉ và DNS có cho phép connection coalescing khi phù hợp không.
- Không chia asset sang nhiều subdomain theo mẹo domain sharding cũ nếu không có lý do đo được.
RFC 9114 về HTTP/3 mô tả QUIC hỗ trợ stream multiplexing, flow control theo stream và thiết lập kết nối độ trễ thấp. Tuy nhiên, hỗ trợ giao thức không tự làm trang nhanh nếu origin chậm, cache sai hoặc tài nguyên quá nặng.
Trọng số: Quan trọng. Công cụ: Chrome DevTools Network, WebPageTest, HTTP/2 Test của Novaverb và HTTP/3 Test của Novaverb.
14. Tiêu chí 132: Giảm số nguồn kết nối
Mỗi origin mới có thể phát sinh DNS, kết nối, TLS, giới hạn ưu tiên riêng và thêm một bên thứ ba vào đường tải trang. Hợp nhất hợp lý font, ảnh, analytics và widget giúp trình duyệt tái sử dụng kết nối tốt hơn.
| Nhóm origin | Câu hỏi giữ hay bỏ | Cách giảm |
|---|---|---|
| Font | Có cần tải bên ngoài không? | Tự host font được cấp phép, giảm weight |
| Analytics | Dữ liệu có được dùng ra quyết định? | Gom qua một container, bỏ tag trùng |
| Chat và widget | Có cần trước tương tác không? | Tải sau consent hoặc sau khi người dùng mở |
| Ảnh và CDN | Có bao nhiêu hostname phục vụ cùng loại asset? | Chuẩn hóa CDN và URL |
| Video | Embed có tải toàn bộ player ngay không? | Dùng poster và facade trước khi bấm |
Không đặt mục tiêu một origin tuyệt đối. CDN ảnh, cổng thanh toán hoặc video có thể cần domain riêng. Quyết định dựa trên waterfall, giá trị tính năng, quyền riêng tư, độ tin cậy và khả năng kiểm soát cache.
Hãy lập bảng origin theo template: domain, số request, byte, thời điểm bắt đầu, tổng main-thread work, owner và mục tiêu kinh doanh. Origin không có owner hoặc không ai đọc dữ liệu thường là ứng viên cần loại bỏ trước.
Trọng số: Quan trọng. Công cụ: Chrome DevTools Network, WebPageTest và Website Performance Test của Novaverb.
15. Tiêu chí 133: Làm ấm Cache và chống Cache Stampede
Sau purge, deploy hoặc khi entry hết hạn, URL ưu tiên nên được làm ấm và nhiều request đồng thời cho cùng một cache miss phải được điều phối. Nếu hàng trăm request cùng lúc đều chạy PHP và truy vấn database để tái tạo cùng một trang, cache trở thành nguyên nhân của đợt tải đột biến.
Tài liệu Nginx FastCGI cache mô tả fastcgi_cache_lock: chỉ một request được phép tạo cache entry mới, các request còn lại chờ kết quả hoặc timeout. Tên cơ chế khác nhau theo CDN, reverse proxy, plugin hoặc thư viện, nhưng nguyên tắc là request coalescing hoặc single-flight.
- Làm ấm trang chủ, hub, landing page, bài có traffic và sitemap quan trọng.
- Giới hạn tốc độ warm để không biến crawler nội bộ thành tải tấn công origin.
- Dùng cache lock hoặc request coalescing cho key nóng.
- Thêm jitter vào TTL để nhiều key không hết hạn cùng một giây.
- Cân nhắc stale-while-revalidate hoặc stale-if-error khi tính đúng đắn cho phép.
- Theo dõi HIT ratio, MISS, thời gian tái tạo, hàng đợi và tải database.
- Không warm trang cá nhân hóa, giỏ hàng hoặc endpoint có side effect.
Warm cache không sửa được cache key sai. Nếu cookie tracking tạo một key mới cho mỗi người, bot warm chỉ làm nóng một biến thể. Trước hết phải chuẩn hóa key, loại cookie không cần và xác định biến nào thật sự làm response khác nhau.
Trọng số: Nên có. Công cụ: Cache Logs, APM, Load Test, Server Response Time Checker của Novaverb và Website Performance Test của Novaverb.
16. Cấu hình Cache theo từng stack WordPress
Plugin, web server, CDN và hosting managed có thể cùng cache HTML; cần chọn một nguồn điều phối rõ thay vì bật mọi lớp với mặc định khác nhau. Hai lớp cache không xấu, nhưng purge, bypass và cache key phải thống nhất.
| Stack | Lớp thường gặp | Điểm cần kiểm |
|---|---|---|
| Apache hoặc Nginx và plugin | Plugin page cache, browser cache | Rewrite rule, file cache, purge khi cập nhật |
| LiteSpeed Server | LiteSpeed Cache tại server và plugin điều khiển | HIT header, exclusion, crawler warm |
| Nginx FastCGI Cache | Reverse proxy hoặc FastCGI page cache | Cache lock, bypass cookie, purge URL |
| CDN Full Page Cache | Edge HTML cache và origin cache | Cache Rules, cookie, geographic variant |
| Managed WordPress | Cache độc quyền của nhà cung cấp | Plugin tương thích, API purge, giới hạn cấu hình |
| WooCommerce | Cache công khai có exclusion theo phiên | Cart, checkout, account, currency và tồn kho |
Không cài thêm plugin cache trước khi biết hosting đã cache gì. Một plugin có thể minify và browser cache nhưng page cache do host đảm nhiệm. Plugin khác có thể xóa origin cache nhưng không purge CDN. Hãy vẽ sơ đồ request thật và ghi owner cho từng lớp.
Query Monitor hữu ích để thấy truy vấn và hook khi trang bị BYPASS; header và TTFB cho biết hành vi khi HIT. Hai góc nhìn bổ sung nhau. Không dùng số query của một request đã page-cache để kết luận database đã tối ưu vì PHP có thể chưa chạy.
17. Thứ tự ưu tiên triển khai Cache và kết nối
Ưu tiên theo rủi ro sai dữ liệu trước, sau đó tới TTFB, cache hit, tài nguyên đầu trang và số origin. Một lỗi shared cache lộ nội dung cá nhân hóa nghiêm trọng hơn vài trăm mili giây tải font.
| Ưu tiên | Việc | Lý do | Điều kiện nghiệm thu |
|---|---|---|---|
| P0 | Loại trừ trang riêng tư và giao dịch | Bảo mật và tính đúng đắn | Không có HIT công khai khi đăng nhập hoặc checkout |
| P1 | Page cache trang công khai | Giảm TTFB và tải origin lớn | HIT ổn định, TTFB giảm, nội dung đúng |
| P1 | Versioning và Cache-Control asset | Cho phép cache dài hạn an toàn | URL đổi khi byte đổi |
| P1 | Purge có phạm vi | Đảm bảo nội dung mới xuất hiện | Đúng URL, đúng lớp, không xóa toàn bộ tùy tiện |
| P2 | Font và resource hints | Giảm chờ render đầu trang | Không preload thừa, không thiếu glyph |
| P2 | Giảm origin, kiểm h2/h3 | Giảm handshake và tận dụng multiplexing | Waterfall ít kết nối thừa hơn |
| P3 | Warm và chống stampede | Ổn định khi purge hoặc traffic cao | Origin không tăng tải đột biến |
Đừng triển khai tất cả trong một lần nếu chưa có giám sát. Mỗi thay đổi nên có một phép kiểm và rollback: cache rule, font preload, CDN hostname, protocol hoặc warm job. Cách này giúp biết cải thiện đến từ đâu và tránh lỗi chỉ xuất hiện khi cache đã ấm.
18. Quy trình Audit trước và sau tối ưu
Audit cần bao phủ cả cold cache, warm cache, người dùng ẩn danh, người dùng đăng nhập và nhiều loại template. Chỉ đo trang chủ ở một lần tải không đủ đại diện cho WordPress, cũng không phát hiện được lỗi bypass theo cookie hoặc template.
- Chọn mẫu: trang chủ, danh mục, bài viết, landing page, tìm kiếm, đăng nhập và trang giao dịch nếu có.
- Lưu status, TTFB, Cache-Control, Age, ETag, Last-Modified, Vary và cache status.
- Đo request lạnh, sau đó lặp ba đến năm request ấm.
- Kiểm HTML ẩn danh và HTML theo phiên không bị trộn.
- Xuất danh sách origin, protocol, connection ID và chi phí handshake.
- Kiểm font file, weight, preload, CORS và
font-display. - Kiểm URL asset có version và đổi khi build mới.
- Thử purge một URL và xác minh đúng chuỗi cache.
- Mô phỏng nhiều request sau purge trên staging hoặc môi trường an toàn.
- So median trước sau, HIT ratio, tải CPU, database và lỗi 5xx.
- Ghi điều kiện rollback nếu nội dung cũ hoặc sai người dùng xuất hiện.
- Đo lại sau deploy từ vị trí bên ngoài hệ thống.
| Nhóm bằng chứng | Trường cần lưu |
|---|---|
| Response | URL, status, protocol, TTFB, header cache |
| Cache | HIT, MISS, BYPASS, Age, key, TTL |
| Connection | Origin, DNS, connect, TLS, reused connection |
| Font | File, format, weight, preload, transfer size |
| Deploy | Version, purge scope, warm list, thời điểm kiểm |
Kết quả audit nên đủ để một người khác tái hiện cùng phép đo, nhận ra lớp nào tạo độ trễ và xác minh thay đổi có cải thiện mà không phục vụ sai dữ liệu. Nếu chưa làm được điều đó, báo cáo vẫn mới là ảnh chụp hiện trạng.
19. Công cụ, tài liệu gốc và lộ trình học tiếp
Công cụ nhanh giúp phát hiện header, giao thức và TTFB; DevTools, cURL, log và APM giúp truy nguyên tới đúng lớp cache hoặc kết nối. Kết quả tốt là cấu hình có thể giải thích và tái kiểm, không chỉ một ảnh chụp điểm số.
Công cụ Novaverb
- PageSpeed Checker của Novaverb: rà hiệu năng tổng thể và tín hiệu liên quan tới cache, font và tài nguyên.
- Website Performance Test của Novaverb: kiểm waterfall, thời gian tải và nguồn kết nối.
- Server Response Time Checker của Novaverb: đo phản hồi máy chủ trước và sau page cache.
- HTTP/2 Test của Novaverb: xác nhận website hỗ trợ HTTP/2.
- HTTP/3 Test của Novaverb: kiểm tra khả năng phục vụ HTTP/3.
Tài liệu gốc
- WordPress Cache Handbook
- MDN HTTP Caching
- web.dev Optimize Web Fonts
- web.dev Resource Hints
- RFC 9113, HTTP/2 và RFC 9114, HTTP/3
- Nginx FastCGI Cache
Đọc lại SEO WordPress #13 về Core Web Vitals, SEO WordPress #14 về điểm PageSpeed và SEO WordPress #15 về hình ảnh và code để nối cache với LCP, TTFB và đường kết xuất quan trọng.
Nếu muốn thực hành theo hệ thống trên website thật, có thể tham khảo chương trình đào tạo SEO, trang tổng hợp khóa học SEO và cấu trúc chuyên sâu của khóa học SEO Master. Các trang mô tả phạm vi và cách học để người đọc tự đối chiếu nhu cầu.
Chuỗi thực hành: phân loại response, đặt cache policy, kiểm HIT, version asset, purge có phạm vi, đo protocol và giám sát cache miss sau triển khai.
20. Câu hỏi thường gặp và kết luận
Các câu trả lời sau xử lý những nhầm lẫn thường gặp khi cấu hình cache và kết nối cho WordPress. Mục tiêu là nhanh hơn mà vẫn đúng dữ liệu, đúng người dùng, đúng thời điểm cập nhật và dễ vận hành khi nhiều lớp cache cùng tồn tại.
Có nên đặt cache một năm cho toàn bộ website không?
Không. Thời gian một năm phù hợp với tài nguyên tĩnh đã phiên bản hóa và không đổi tại cùng URL. HTML, API, dữ liệu riêng tư và trang giao dịch cần chính sách khác dựa trên độ tươi và mức chia sẻ.
no-cache có phải là không lưu Cache không?
Không. no-cache cho phép lưu nhưng yêu cầu xác thực lại trước khi tái sử dụng. no-store mới yêu cầu không lưu response. Hai chỉ thị giải quyết hai nhu cầu khác nhau.
Có Redis thì đã có Page Cache chưa?
Chưa chắc. Redis thường được dùng làm persistent object cache. Page cache giữ HTML hoàn chỉnh và có thể nằm ở plugin, web server, reverse proxy hoặc CDN. Cần kiểm response và cache status.
Vì sao purge Cache rồi vẫn thấy nội dung cũ?
Có thể còn cache ở lớp khác như CDN, page cache origin, object cache, browser hoặc service worker. Cũng có thể HTML mới vẫn tham chiếu asset cũ. Cần xác định chuỗi cache thay vì chỉ hard refresh.
Có nên preload tất cả Webfont không?
Không. Preload chỉ dành cho font chắc chắn cần sớm. Preload quá nhiều weight và style làm chúng cạnh tranh với CSS, ảnh LCP và tài nguyên quan trọng khác.
HTTP/3 có luôn nhanh hơn HTTP/2 không?
Không thể kết luận cho mọi mạng và mọi website. HTTP/3 có đặc tính kết nối và multiplexing của QUIC, nhưng hiệu quả thực tế còn phụ thuộc mạng, máy chủ, CDN, cache, payload và cách trang tải tài nguyên.
Có cần thêm Connection: keep-alive cho HTTP/2 không?
Không. Header Connection và Keep-Alive là connection-specific và không được dùng trong HTTP/2 hoặc HTTP/3. Trình duyệt và giao thức tự quản lý kết nối theo cơ chế của chúng.
Cache warming có nên chạy toàn bộ Sitemap không?
Không mặc định. Hãy ưu tiên URL có traffic, hub, landing page và template quan trọng, giới hạn tốc độ và theo dõi tải origin. Warm toàn bộ site lớn sau purge có thể tự tạo traffic spike.
Kết luận: cache hiệu quả không nằm ở việc giữ mọi thứ lâu nhất. Nó nằm ở khả năng phân loại response, version tài nguyên, phục vụ page cache đúng trang, purge đúng phạm vi, tái sử dụng kết nối và bảo vệ origin khi cache lạnh. Khi từng lớp có chính sách và bằng chứng riêng, WordPress vừa nhanh hơn vừa ít rủi ro phục vụ sai dữ liệu.