Lưu ý quan trọng: Nên backup toàn bộ website (ví dụ bằng UpdraftPlus) trước khi thử nghiệm với Cloudflare R2, mục đích là để nếu có sơ sót, chúng ta có thể khôi phục lại được website mà không bị sứt mẻ tí dữ liệu nào. Ngoài ra sử dụng R2 chỉ nên áp dụng với người dùng có kinh nghiệm ít nhiều với WordPress vì nó đòi hỏi một số yếu tố kỹ thuật nhất định & về cơ bản các website mới không cần đến R2 (sẽ nói kỹ hơn lý do bên dưới).
–
Đối với các website nhiều ảnh và có nguồn lực đầu tư hạn chế cho chi phí lưu trữ thì tổng dung lượng ảnh cao có thể trở thành vấn đề.
Một số cái điển hình:
- Các gói shared hosting/VPS nhỏ, tiết kiệm thường đi kèm với giới hạn dung lượng ổ lưu trữ mà nếu quá nhiều ảnh nó sẽ không phù hợp.
- Nếu website có lượng truy cập cao thì request về hosting gốc không hề nhỏ => tăng gánh nặng & băng thông. Trong khi giới hạn băng thông thường hiếm khi trở thành vấn đề (trừ khi lưu lượng cực kỳ cao) thì gánh nặng cho hosting gốc vẫn là rõ ràng.
- Khi di chuyển website sang nhà cung cấp mới, việc chuyển dữ liệu qua lại rất mất thời gian, mặc dù có các giải pháp di chuyển tốc độ cao như SSH, thì nó vẫn không phải biện pháp phổ biến (do khó dùng hơn). Cách di chuyển truyền thống vẫn là tải toàn bộ website về máy tính cá nhân, sau đó up lên nhà cung cấp mới.
- Hạn chế tần số backup, các website dung lượng lớn khó có thể backup với tần số cao & có nhiều bản lưu trữ. Dung lượng miễn phí trên cloud thường không nhiều (ví dụ Google Drive một trong các đơn vị có dung lượng cloud miễn phí cao cũng chỉ 15 GB, tức là chỉ 4 bản lưu cho website hơn 3 GB; 2 bản lưu cho website trên 5 GB, 1 bản lưu trên website từ 8 GB đổ lên).
–
Tại sao CDN không giải quyết được toàn bộ vấn đề?
CDN khi áp dụng (ví dụ dùng BunnyCDN) sẽ giảm tải rất sâu request về máy chủ gốc, tuy nhiên vấn đề lưu trữ tại hosting gốc của bạn vẫn không được giải quyết, nếu bạn có 2GB ảnh, nó vẫn cần 2GB ảnh ở hosting.
–
Cloudflare R2 giải quyết vấn đề trên thế nào?
Nó giải quyết bằng cách lưu trữ hộ toàn bộ ảnh trên website của bạn, và bạn loại bỏ được toàn bộ các rắc rối do ảnh chiếm nhiều dung lượng cũng như request về hosting gốc.
Và Cloudflare vẫn như mọi khi, cung cấp gói miễn phí chất lượng rất cao (và ổn định) cho các chủ web nhỏ, bậc miễn phí của họ như sau:
- 10 GB miễn phí lưu trữ.
- 1 triệu yêu cầu đẩy lên (post) miễn phí.
- 10 triệu yêu cầu tải xuống (get) miễn phí.
- Không tính phí băng thông.
Các thông số này đáp ứng dư hầu hết các website từ nhỏ đến trung bình, thậm chí là hơi lớn cũng không quá lo.
Tham khảo thêm về cơ chế tính giá của Cloudflare R2 (phức tạp hơn khá nhiều ý niệm sơ sài đẩy ảnh lên và tải ảnh xuống, nhưng chủ yếu nó dành cho người xài ở quy mô lớn).
–
Ai không nên dùng Cloudflare R2?
Giải pháp là để giải quyết vấn đề, nếu bạn không có vấn đề thì dĩ nhiên tốt nhất là cứ ngồi yên đấy, đừng làm gì cả! Những người trong các trường hợp dưới đây sẽ không cần đến R2:
- Website mới thành lập.
- Thành lập lâu rồi nhưng ảnh chỉ vài trăm MB, và hosting hoặc/và CDN đang xử lý tốt request.
- Rất nhiều ảnh, nhưng bạn dư dả, đủ khả năng thuê hosting chất lượng cao, dung lượng lớn mà không phải lăn tăn gì nhiều về vấn đề chi phí.
Bây giờ chúng ta sẽ đi vào chi tiết các bước làm. Và để kết hợp tốt với WordPress, với mục đích là tiện up toàn bộ các ảnh cũ lên R2, và tiện dùng như bình thường khi đăng bài (bạn up ảnh lên WordPress, plugin sẽ tự động tải lên R2), chúng ta sẽ kết hợp thêm với plugin Advanced Media Offloader. Nhưng phần plugin sẽ nói ở các bước sau, bước đầu là thiết lập trên R2.
–
A. Cài đặt
1. Tạo R2 object storage
Đăng nhập Cloudflare, tìm đến R2 object storage, click Create bucket.
Tiếp đến thao tác mấy cái sau:
- Bucket name: đặt tên cho bucket, hiểu đơn giản nó như tên cho cái thùng chứa toàn bộ ảnh trên website.
- Location: mặc định nó sẽ tự chọn đúng vị trí lưu trữ gần nhất với vị trí của bạn, ví dụ từ Việt Nam sẽ là Asia Pacific. Nếu website của bạn nhắm đến các khu vực khác, nó có button nhỏ bên dưới để bạn chủ động chọn.
- Default Storage Class: nên để mặc định, tức là Standard (tiêu chuẩn). Cái này quan trọng vì gói miễn phí chỉ áp dụng cho Standard.
2. Cài plugin Advanced Media Offloader
Chọn Cloud Provider là Cloudflare R2.
Chú ý mấy thông tin cần nhập ở phần General Settings, chúng ta sẽ phải lấy thông tin ở bên R2 điền vào đây.
3. Tạo API token
Để giao tiếp từ xa với R2 (nghĩa là ta không cần vào Cloudflare up thủ công từng ảnh lên) chúng ta cần API token, và lấy thông tin này để đưa vào plugin trên.
Cách làm:
- Vào R2 object storage -> Overview -> API tokens -> Manage
- Ở Account API Tokens, nhấn Create Account API Tokens.
Nhập thông tin như sau:
- Token name: tên thôi, để như mặc định, hoặc đổi tên gì tùy bạn.
- Permissions: cấp quyền cho cái API này, nên để là Object Read & Write, để nó được quyền tải lên & xuống ảnh từ storage. Cái này quan trọng, nếu bạn chỉ để nó quyền chỉ đọc như mặc định (tức là chỉ read, nó sẽ không tải ảnh lên R2 được).
- Specify bucket: chọn Apply to specific buckets only, rồi chọn bucket mà bạn tạo ở bước 1. Bước này chủ yếu liên quan đến bảo mật, tức là khóa API đó chỉ áp dụng cho bucket bạn chỉ định thay vì toàn bộ các bucket mà có thể có thể nếu bạn tạo thêm cho các website khác. Đại khái cái này giống như mỗi nhà một khóa cửa riêng, chứ không phải tất cả cùng chung một chìa khóa cửa.
Các cái khác để mặc định, rồi chọn Create Account API Token.
Nó sẽ có các thông tin quan trọng chỉ hiển thị một lần (vì lý do bảo mật Cloudflare sẽ không hiển thị lại nó lần hai) là: Access Key ID & Secret Access Key, bạn cần copy chúng lại để chốc nữa dùng.
Endpoint URL thì có thể xem lại, nhưng tiện thể cứ copy lưu lại chốc nữa lấy thông tin cho nhanh để điền vào plugin.
4. Thiết lập custom domain cho bucket
Ở đây bạn sẽ thiết lập tên miền tùy chỉnh cho bucket, ví dụ img.ten-mien-cua-ban.com
Bước này bắt buộc phải làm thì bucket mới công khai ra mạng internet được (mặc định nó không public cho đến khi bạn thiết lập custom domain cho bucket).
Vào bucket ->settings -> custom domains để thêm tên miền tùy chỉnh, nếu bạn đang dùng DNS của Cloudflare (nên vậy) thì quá trình này diễn ra rất tiện.
5. Quay ra plugin và thiết lập các thông tin cơ bản
Nhập theo thông tin cụ thể của bạn. Bên dưới là trường hợp của tôi.
Nhấn Test Connection để kiểm tra, nếu bạn nhập đúng thông tin, nó sẽ hiện thông báo là đã kết nối. Nhấn Save Credentials để lưu.
Tiếp phần bên dưới (Lưu ý ở phần Rentention Policy, đây chỉ là tùy chọn của tôi, an toàn hơn cho đa số là chọn Retain Local Files, sẽ giải thích kỹ hơn ngay sau đây):

Phần Rentention Policy liên quan đến việc bạn xử lý ảnh gốc thế nào, ở đây có nhiều tùy chọn, và tùy chọn tôi chọn trên hình sẽ là cách để hosting gốc gọn gàng nhất có thể, nhưng nó cũng có phiền phức nhất định mà bạn cần hiểu kỹ. Tôi sẽ đề cập ý nghĩa của tất cả các tùy chọn bên dưới đây:
- Retain Local Files: Nghĩa là nó giữ lại toàn bộ ảnh ở hosting gốc, việc sử dụng R2 lúc này có ý nghĩa giảm request, nhưng dung lượng hosting gốc cần lưu ảnh vẫn thế. Tuy nhiên đây lại là cách an toàn nhất khi nói về góc độ dự phòng cho toàn bộ ảnh trên website (hoặc khi bạn muốn ngừng sử dụng R2 đỡ mất công khôi phục lại thư mục upload).
- Smart Local Cleanup: Sau khi đẩy hết ảnh lên R2 thì nó loại bỏ toàn bộ các bản sao của ảnh gốc ở hosting gốc, nhưng giữ lại file ảnh gốc. Đây là cách dự phòng cân bằng, vẫn giảm được dung lượng lưu trữ tương đối đáng kể, nhưng vẫn có file ảnh dự phòng trong trường hợp xấu nhất (ví dụ vì lý do nào đó mà R2 bị xóa, hỏng).
- Full Cloud Migration: Loại bỏ tất cả các file ảnh ở hosting gốc, cái này là cách mạnh nhất để giảm lưu trữ ở hosting gốc, nhưng lúc này ảnh của website hoàn toàn phụ thuộc vào R2. Áp dụng cách này thì cần để ý định kỳ backup lại các file ảnh trên R2, mặc dù rủi ro liên quan đến R2 là rất thấp, nhưng backup chưa bao giờ là thừa với bất kỳ nhà cung cấp nào.
Nhấn Lưu thay đổi để lưu các tùy chọn.
B. Up toàn bộ ảnh cũ lên R2
Với thiết lập ở phần A, các ảnh mới từ lúc đó sẽ tự động được up lên R2 và được thay thế link bằng R2. Tuy nhiên các ảnh cũ thì chưa.
Số lượng các ảnh cũ có thể rất lớn, ví dụ như trang kiencang.net có đến hơn 5300 ảnh và tính cả các ảnh nhỏ cắt thêm từ ảnh gốc là hơn 30 ngàn.
Bạn vào phần Media Overview trên plugin sẽ thấy thông tin thống kê là website có bao nhiêu ảnh, bao nhiêu ảnh đã được up lên R2 (offloaded media) và bao nhiêu ảnh chưa được up (non-offloaded media). Với lần đầu chưa up ảnh cũ lên bạn sẽ thấy con số ở phần non-offloaded media là rất lớn.
Để up hàng loạt ảnh bạn phải vào terminal của VPS/shared hosting và sử dụng lệnh sau:
wp advmo offload
Có thể mất 2 – 3 tiếng để up số lượng 30 ngàn ảnh từ VPS lên Cloudflare R2.
C. Kiểm tra lại
Sau khi hoàn thành, bạn bắt buộc cần kiểm tra lại website xem nó đã chèn ảnh đúng chưa (plugin xử lý việc này). Quá trình chèn link ảnh (để thay link ảnh cũ bằng link của R2) của nó là tự động, và thường không có vấn để gì.
Cách kiểm tra hay nhất là trên Chrome chuột phải vào ảnh và nhấn Kiểm tra để xem cách nó nhúng link. Nếu bạn thấy kiểu như thế này là nó đã làm đúng (tất cả các link ảnh của bạn phải là link của R2, tức là link dạng subdomain tùy chỉnh ở trên img.ten-mien-cua-ban.com):
<figure class="aligncenter size-full"><a href="https://img.kiencang.net/2025/11/toc-do-ghi-RAM.png"><img fetchpriority="high" decoding="async" width="776" height="748" src="https://img.kiencang.net/2025/11/toc-do-ghi-RAM.png" alt="Tốc độ ghi RAM, block 1 KiB" class="wp-image-26528" srcset="https://img.kiencang.net/2025/11/toc-do-ghi-RAM.png 776w, https://img.kiencang.net/2025/11/toc-do-ghi-RAM-300x289.png 300w, https://img.kiencang.net/2025/11/toc-do-ghi-RAM-768x740.png 768w" sizes="(max-width: 776px) 100vw, 776px"></a><figcaption class="wp-element-caption">Tốc độ ghi RAM, block 1 KiB</figcaption></figure>
Ví dụ trong đoạn mã trên, toàn bộ link ảnh trên host gốc đã được thay thế bằng link ảnh trên Cloudflare R2.
Tuy nhiên cũng có trường hợp plugin xử lý không hoàn hảo, đôi chỗ bạn sẽ thấy vẫn còn link ảnh cũ, đặc biệt hay gặp trong phần thẻ a, vì có vẻ plugin chỉ xử lý link trong thẻ img.
Để đồng bộ hóa triệt để các link ảnh cũ, bạn cần đến plugin như Better Search Replace, công cụ này sẽ giúp tìm toàn bộ thông tin link ảnh cũ trong các bảng cơ sở dữ liệu và thay nó bằng link ảnh mới.
Ví dụ trong trường hợp của tôi nó sẽ tìm kiếm ảnh có cấu trúc cũ (tiền tố sẽ chứa https://ten-mien-cua-ban.com/wp-content/uploads và thay thế nó bằng https://img.ten-mien-cua-ban.com
Có nhiều bài hướng dẫn sử dụng Better Search Replace trên mạng, bạn hãy tham khảo thêm để dùng cho chuẩn, nói chung nó rất cơ bản, không phải dạng khó dùng.
E. Tăng thời gian cache trình duyệt cho ảnh
Mặc định cache trình duyệt cho tài nguyên tĩnh trên Cloudflare là 4 tiếng. Với ảnh cái này cần nâng lên cao hơn, vì ảnh hiếm khi thay đổi cập nhật gì, nếu không muốn nói là giữ nguyên như vậy mãi trong hầu hết các trường hợp.
Để tăng thời gian cache trình duyệt cho ảnh bạn dùng tính năng Cache Rules (trên Cloudflare, vào tab Caching, chọn mục tương ứng). Tiếp đến làm như sau:
- Create Rule
- Đặt tên cho Rule tùy ý, ví dụ Browser TTL Image
- Custom filter expression để như mặc định
- Field: URI Full
- Operator: contains
- Value:
img.ten-mien-cua-ban.com - Eligible for cache được tích chọn
- Ở Browser TTL chọn Override origin and use this TTL, chọn thanh xổ bên dưới là 1 month (một tháng).
- Các cái khác không động đến.
- Click Deploy để triển khai.
Kiểm tra xem đã làm đúng chưa:
Bạn vào một trang bất kỳ có ảnh trên website bằng trình duyệt Chrome, nhấn phím F12, rồi F5 để tải lại trang, chọn Img cho dễ thấy ảnh, click vào một ảnh bất kỳ trong list, nhìn thấy cái Cache-Control có max-age=2678400 là đúng. Con số 2678400 là số giây, nó bằng khoảng 1 tháng.
F. Nhận xét
Việc chuyển đổi ảnh lên Cloudflare R2 nhìn chung là khá dễ dàng với ai đã từng dùng WordPress một thời gian.
Mấu chốt là luôn có backup để sơ suất cũng có thể khôi phục lại toàn bộ.
Một rắc rối phụ là bạn sẽ cần định kỳ backup ảnh trên R2, có thể sử dụng các công cụ rất mạnh để làm việc này như Rclone, chỉ với vài lệnh, nó sẽ tải toàn bộ ảnh của bạn từ R2 xuống máy tính cá nhân & thêm một lớp dự phòng để đẩy data lên Google Drive.
Cũng rất tuyệt vời khi plugin Advanced Media Offloader cung cấp kết nối cho WordPress với R2 trơn tru & hoàn toàn miễn phí, một số plugin có tính năng tương tự với giá không hề rẻ.
Cloudflare cũng nổi tiếng trong việc có chính sách bền vững & rất có lợi cho người dùng nhỏ, vì vậy mà nguy cơ R2 tăng giá khiến người dùng cá nhân phải bỏ nó là rất hiếm.
Tổng hợp lại, chúng ta có một kết hợp đáng để thử, đặc biệt phù hợp với mấy trang cá nhân nhưng nhiều ảnh muốn giảm tối đa chi phí.
–
Cuối cùng nhưng quan trọng: nếu website của bạn có lịch sử phát triển lâu dài thì một vấn đề dễ phát sinh là plugin Advanced Media Offloader không xử lý chính xác toàn bộ ảnh! Đây là vấn đề nghiêm trọng có thể gây lỗi link ảnh nếu ảnh chưa được up đầy đủ lên Cloudflare R2. Đọc bài viết sau để khắc phục vấn đề thiếu ảnh trên R2 nếu nó xảy ra với website của bạn (nó cũng xảy ra trên kiencang.net, vì website này đã hơn 12 năm tuổi).


