Cách isolate WordPress client sites mà không cần dùng Multisite
Isolation là một từ nghe có vẻ hiển nhiên cho đến khi khách hàng hỏi bạn một câu hóc búa: nếu một site khác trên cùng install này bị hack hoặc hỏng data, site của tôi có tèo theo không? Nếu câu trả lời của bạn phụ thuộc vào một database dùng chung, câu trả lời chân thật nhất là “hên xui”. Bài viết này sẽ hướng dẫn bạn quy trình setup để thực hiện wordpress client site isolation without multisite một cách triệt để (tách biệt data, tách biệt code, tách biệt failure domain) trong khi bạn vẫn chỉ quản lý một bản cài đặt WordPress duy nhất.
”Isolation” thực sự nghĩa là gì
Isolation không phải là một tính năng duy nhất. Nó gồm ba yếu tố, và Multisite chỉ cung cấp được khoảng một phần ba trong số đó.
- Data isolation: row, user và option của một tenant không thể bị đọc hay phá hỏng bởi một tenant khác.
- Code isolation: mỗi tenant có thể chạy theme và plugin với version riêng, nên việc update hay một plugin lỗi ở Khách hàng A sẽ không bao giờ đụng chạm đến Khách hàng B.
- Failure-domain isolation: khi một tenant bị lỗi (fatal error, hỏng table, restore sai), “bán kính sát thương” chỉ dừng lại ở tenant đó.
Multisite dùng chung một database và một thư mục wp-content cho tất cả subsite. Các subsite chỉ phân biệt qua blog ID và table prefix trong chung một database đó. Cơ chế này mang lại khả năng tách data rất yếu và không có gì hơn: mọi subsite đều chạy chung plugin và theme từ cùng một thư mục, và một table hỏng hay fatal error của plugin đều nằm trong cùng một failure domain với tất cả mọi người. Prefix chỉ phân biệt các row. Chúng không phân tách rủi ro.
Tách biệt database với prefix, MySQL riêng hoặc SQLite

Cấp database là phần có nhiều lựa chọn nhất, nên hãy chọn lựa cẩn thận.
- Dùng chung MySQL, mỗi tenant một prefix (plugin miễn phí): GrabWP Tenancy cấp cho mỗi tenant một table prefix độc nhất trong database chung cộng với thư mục uploads tách biệt. Đây là sự phân tách row level thực sự và là cách nhanh nhất để dựng nhiều client site, nhưng các tenant vẫn sống chung trong một database, nên nó chỉ là isolation một phần.
- Database MySQL riêng cho mỗi tenant (Pro): GrabWP Tenancy Pro cấp cho mỗi tenant một database MySQL riêng biệt. Đây là wordpress tenant database isolation hoàn toàn với rủi ro chéo bằng 0 ở tầng database: một lock, một table phình to hay một index hỏng sẽ chỉ nằm gọn trong database của khách hàng đó.
- SQLite cho mỗi tenant (Pro): đối với các tenant nhẹ hoặc cần tính di động, Pro có thể cho tenant chạy bằng một file database SQLite riêng, giúp tenant đóng gói hoàn toàn và cực kỳ dễ di chuyển.
Vì Pro hỗ trợ migration giữa các loại database khác nhau, bạn không hề bị lock-in vào một lựa chọn. Bạn có thể bắt đầu với mô hình prefix chung cho một khách hàng, sau đó move tenant đó sang database MySQL hoặc SQLite riêng mà không phải đập đi xây lại.
Tách biệt code qua wp-content riêng cho từng tenant

Tách biệt data mới chỉ giải quyết được một nửa vấn đề. Nếu hai khách hàng dùng chung một thư mục wp-content, họ đang dùng chung một tập file plugin và theme, nghĩa là một bản update plugin hay một theme không tương thích của khách này sẽ trở thành rắc rối của tất cả những người khác.
Bản miễn phí đã isolate uploads cho mỗi tenant. Bản Pro tiến xa hơn với khả năng tách bạch wp-content hoàn toàn: theme, plugin và uploads đều riêng biệt cho từng tenant, mỗi cái nằm trong thư mục content riêng. Nhờ đó Khách hàng A có thể chạy một page builder bản cũ ghim chết version, trong khi Khách hàng B chạy bản mới nhất, không hề bị trùng file hay đụng độ version. Đây là tính năng then chốt cho per-tenant wordpress isolation. Pro cũng cho phép đặt vị trí data của tenant nằm hẳn ra ngoài wp-content/uploads, rất tiện khi bạn muốn lưu trữ dữ liệu của tenant trên một volume riêng.
Định tuyến từng tenant mà không cần DNS
Việc isolation sẽ trở nên vô nghĩa nếu khách hàng không thể truy cập vào site của họ, và bạn không nên phải đụng tới DNS mỗi lần tạo tenant mới. Để isolate wordpress sites without multisite, GrabWP Tenancy cung cấp hai cách định tuyến:
- Định tuyến theo subdirectory: truy cập một tenant qua
yoursite.com/site/client-amà không cần thay đổi bất kỳ cấu hình DNS nào. Prefixsitecó thể đổi thông qua hằng sốGRABWP_TENANCY_PATH_PREFIXnếu bạn muốn dùng đường dẫn khác. - Định tuyến custom domain: trỏ domain riêng của khách hàng thẳng vào tenant khi họ đã sẵn sàng với URL mang thương hiệu riêng.
Định tuyến theo subdirectory là một siêu năng lực thầm lặng trong quy trình isolation: bạn có thể provision, test và bàn giao một client site cách ly hoàn toàn trước cả khi có DNS. Tính năng cache isolation cũng được tích hợp sẵn để các tenant không đụng nhau trên hạ tầng chung. Plugin tự động vô hiệu hóa các drop-in page-cache cho từng request và gắn prefix vào các object-cache key bằng ID của tenant, giúp ngăn chặn tình trạng đụng độ cache chéo khi dùng chung backend Redis hoặc Memcached.
Tách biệt failure domain bằng backup và restore riêng
Failure domain là khía cạnh người ta hay quên cho đến khi có sự cố xảy ra. Isolation thực sự có nghĩa là bạn có thể backup và restore một khách hàng mà không đụng chạm đến bất kỳ ai khác.
Pro cung cấp quy trình backup 7 bước và restore 8 bước riêng cho từng tenant với thanh tiến trình AJAX, nhờ đó việc khôi phục Khách hàng A là một tác vụ tự đóng gói hoàn toàn. Bạn có thể lên lịch backup tự động (mỗi giờ, 12 tiếng, hàng ngày, hàng tuần, hai tuần một lần hoặc hàng tháng) với các cấu hình override riêng cho từng tenant, rồi đẩy chúng lên S3. Sự kết hợp này biến “isolation” từ một tuyên bố kiến trúc thành một thực tế vận hành: một tenant có thể bị rollback về ngày hôm qua trong khi mọi tenant khác vẫn chạy bình thường.
Từng bước dựng một tenant độc lập

Đây là quy trình cụ thể để tạo ra một client site cách ly hoàn toàn:
- Cài đặt GrabWP Tenancy trên bản cài đặt WordPress duy nhất của bạn và kích hoạt nó.
- Tạo tenant cho khách hàng. Trên bản miễn phí, plugin sẽ tự động provision một table prefix riêng biệt và thư mục uploads tách biệt.
- Nâng cấp tenant lên cách ly hoàn toàn bằng bản Pro: assign cho nó một database MySQL hoặc SQLite riêng và thư mục wp-content độc lập để cả data và code đều được phân tách.
- Định tuyến tenant sử dụng định tuyến theo subdirectory (
yoursite.com/site/client-a) để bạn có thể build và test mà không cần DNS, sau đó attach custom domain của khách vào lúc bàn giao. - Lên lịch backup cho tenant đó, add thêm một bucket S3, chạy thử một bản backup thủ công và test restore để đảm bảo failure domain thực sự đã được cách ly.
- Clone từ một base tenant khi bạn cần một điểm xuất phát chuẩn hóa: tính năng clone sẽ copy toàn bộ các table DB và thư mục uploads kèm khả năng tự động thay thế URL (nó sẽ bỏ qua các symlink), để khách hàng mới luôn được bắt đầu từ stack chuẩn của bạn.
Kết quả là bạn có một install để update và theo dõi, với mỗi khách hàng nằm gọn trong ranh giới data, code và khả năng phục hồi của riêng họ.
Khi nào cần isolation nhất
Không phải dự án nào cũng cần database chuyên dụng. Nhưng isolation trở thành yếu tố bắt buộc khi:
- Bạn host các dự án khách hàng mà bạn chịu trách nhiệm theo hợp đồng, nơi sự cố của khách này không được phép ảnh hưởng đến khách khác.
- Khách hàng chạy các phiên bản theme hoặc plugin xung đột không thể tồn tại chung trong một wp-content.
- Bạn cần một ranh giới lỗi và khôi phục rõ ràng cho từng khách hàng, để một cú restore lỗi hay một table hỏng chỉ là vấn đề của một khách, không phải của toàn bộ danh sách khách hàng.
- Bạn muốn có một kiến trúc tách biệt dữ liệu mà bạn có thể giải thích trung thực với các khách hàng hỏi data của họ được lưu ở đâu.
Để hiểu sâu hơn về việc mô hình chia sẻ bị vỡ ở đâu, hãy xem khi nào không nên dùng WordPress Multisite và bài so sánh Multisite vs multi-tenancy.
Bắt đầu ngay
Bắt đầu với plugin GrabWP Tenancy miễn phí để có table prefix độc nhất, uploads cách ly và định tuyến subdirectory không cần DNS. Khi một khách hàng cần isolation hoàn toàn (database MySQL hoặc SQLite riêng, tách bạch wp-content hoàn toàn và backup/restore riêng), hãy nâng cấp lên GrabWP Tenancy Pro với mức giá $9.99/month.
Câu hỏi thường gặp
- Tại sao table prefix của Multisite không được tính là isolation thực sự?
- Multisite dùng chung một database và một thư mục wp-content cho mọi subsite, chỉ phân biệt bằng blog ID và table prefix trong database đó. Một query bị lỗi, một table hỏng hay một plugin ghi sai phạm vi có thể làm sập toàn bộ network. Prefix chỉ tách biệt các row chứ không tách biệt failure domain, nên một site gặp sự cố vẫn có thể kéo theo các site khác.
- Tôi có thể isolate client sites mà không cần trỏ DNS hay tạo server mới không?
- Được. GrabWP Tenancy hỗ trợ định tuyến theo subdirectory như yoursite.com/site/client-a mà không cần đụng đến DNS, song song với tùy chọn custom domain. Mỗi tenant chạy từ chung một install, nên bạn có thể thêm các client site cách ly mà không cần mua thêm hosting hay tạo record DNS mới.
- Bản miễn phí và Pro khác nhau thế nào về khả năng isolation?
- Bản GrabWP Tenancy miễn phí cấp cho mỗi tenant một table prefix độc nhất và thư mục uploads riêng biệt, đây là isolation một phần. Bản Pro nâng cấp thêm bằng cách cấp riêng một database MySQL hoặc SQLite cho mỗi tenant cộng với tách bạch hoàn toàn wp-content. Nhờ vậy, theme, plugin, uploads và data của mỗi khách hàng được cách ly tuyệt đối.
Editorial standards: Our content is written by WordPress experts with hands-on multi-tenancy experience. Articles are fact-checked and regularly updated to ensure accuracy.