Xây dựng Kiến trúc High Availability (HA) cho Headless CMS Strapi trên Cụm 3 VPS Hetzner với HAProxy
1. Đặt vấn đề: Tại sao Strapi cần kiến trúc High Availability (HA)?
Trong kỷ nguyên số hóa, Headless CMS đã trở thành xu hướng tối ưu cho việc quản lý nội dung đa nền tảng. Trong số đó, Strapi nổi lên như một giải pháp mã nguồn mở mạnh mẽ, linh hoạt và được nhiều doanh nghiệp tin dùng. Tuy nhiên, khi lượng truy cập tăng cao hoặc xảy ra sự cố phần cứng, một hệ thống Strapi chạy trên một máy chủ đơn lẻ (Single Instance) sẽ dễ dàng trở thành "điểm nghẽn" gây ngừng trệ toàn bộ hệ thống (Single Point of Failure - SPOF).
Để đảm bảo các ứng dụng Front-end (Web, Mobile App) luôn kết nối mượt mà và không bị gián đoạn, việc xây dựng một kiến trúc High Availability (HA) là giải pháp sống còn. Bài viết này sẽ hướng dẫn bạn cách thiết kế và triển khai hệ thống Strapi có tính sẵn sàng cao trên cụm 3 VPS Hetzner kết hợp với bộ cân bằng tải HAProxy.
2. Mô hình kiến trúc tổng quan hệ thống
Hệ thống của chúng tan sẽ được phân bổ trên 3 VPS của nhà cung cấp Hetzner (một trong những đơn vị cung cấp Cloud Server tối ưu nhất về chi phí và hiệu năng tại châu Âu). Mô hình bao gồm các thành phần cốt lõi sau:
- Node 1 (HAProxy + Strapi Instance 1): Đóng vai trò vừa là bộ cân bằng tải (Load Balancer) vừa chạy ứng dụng Strapi.
- Node 2 (Strapi Instance 2 + Database Primary): Chạy instance Strapi thứ hai và cơ sở dữ liệu chính (PostgreSQL/MySQL).
- Node 3 (Strapi Instance 3 + Database Replica / Shared Storage): Chạy instance Strapi thứ ba, cơ sở dữ liệu dự phòng và hệ thống lưu trữ tệp tin đồng bộ (NFS hoặc S3 Object Storage).
Kiến trúc này đảm bảo rằng nếu một hoặc thậm chí hai VPS gặp sự cố, hệ thống vẫn có thể tiếp nhận và xử lý yêu cầu từ người dùng mà không làm gián đoạn dịch vụ.
3. Các bước triển khai chi tiết
Bước 1: Cấu hình Mạng nội bộ (Private Network) và Cài đặt Cơ sở dữ liệu
Trước tiên, để đảm bảo an toàn bảo mật, các VPS cần giao tiếp với nhau qua mạng nội bộ của Hetzner. Tiếp theo, chúng ta thiết lập cơ sở dữ liệu (khuyến khích sử dụng PostgreSQL). Cơ sở dữ liệu phải được cấu hình để cho phép các kết nối từ cả 3 IP nội bộ của các node Strapi.
Để đạt được HA thực sự cho tầng dữ liệu, bạn nên cấu hình mô hình Primary-Replica hoặc sử dụng giải pháp Managed Database của Hetzner để giảm tải việc quản trị.
Bước 2: Đồng bộ hóa tài nguyên Media (Shared Storage)Mặc định, Strapi lưu trữ các tệp tin media (hình ảnh, video) tại thư mục cục bộ ./public/uploads. Trong môi trường cluster đa máy chủ, nếu User A upload ảnh lên Node 1, User B truy cập qua Node 2 sẽ không thấy ảnh đó. Do đó, chúng ta có hai giải pháp:
- Sử dụng AWS S3 hoặc Hetzner Object Storage: Đây là giải pháp tối ưu nhất. Bạn chỉ cần cài đặt plugin
@strapi/provider-upload-aws-s3và cấu hình để tất cả các node đều upload/download trực tiếp từ Object Storage. - Sử dụng Network File System (NFS): Cấu hình một ổ đĩa mạng chung và mount vào thư mục
public/uploadstrên cả 3 VPS.
Bước 3: Cấu hình và Khởi chạy Strapi Cluster
Tiến hành clone mã nguồn Strapi lên cả 3 VPS. Cần lưu ý rằng cấu hình trong file ./config/server.js và ./config/database.js của cả 3 node phải hoàn toàn giống nhau, đặc biệt là các biến môi trường APP_KEYS, API_TOKEN_SALT, và ADMIN_JWT_SECRET. Nếu các khóa này khác nhau, session của người dùng sẽ bị lỗi khi bộ cân bằng tải chuyển hướng họ giữa các node.
Sử dụng PM2 để quản lý quy trình (Process Manager) giúp Strapi tự động khởi động lại nếu gặp sự cố:
pm2 start server.js --name "strapi-app"Bước 4: Cấu hình Bộ cân bằng tải HAProxy
HAProxy sẽ đóng vai trò là cổng chào duy nhất đón nhận lưu lượng truy cập HTTPS từ ngoài internet, sau đó phân phối đều (Load Balancing) đến 3 node Strapi chạy ở mạng nội bộ. Dưới đây là đoạn cấu hình mẫu cho file /etc/haproxy/haproxy.cfg:
backend strapi_cluster
balance roundrobin
option httpchk GET /api/health
http-check expect status 200
cookie SERVERID insert indirect nocache
server strapi-node1 10.0.0.1:1337 check cookie node1
server strapi-node2 10.0.0.2:1337 check cookie node2
server strapi-node3 10.0.0.3:1337 check cookie node3Giải thích cấu hình: Thuộc tính balance roundrobin giúp chia đều tải tuần hoàn. Thuộc tính option httpchk định kỳ kiểm tra trạng thái hoạt động (Health Check) của Strapi qua endpoint /api/health. Nếu một node chết, HAProxy sẽ tự động loại bỏ node đó ra khỏi cụm điều hướng.
4. Những lưu ý quan trọng về Session và Tối ưu hóa SEO
Khi vận hành Strapi trong môi trường Cluster, khu vực Admin Dashboard yêu cầu trạng thái đăng nhập liên tục (Stateful). Việc cấu hình cookie SERVERID như trên giúp kích hoạt tính năng Sticky Sessions. Điều này đảm bảo một quản trị viên khi đang nhập liệu sẽ luôn được giữ kết nối với duy nhất một node, tránh tình trạng bị logout liên tục do chuyển đổi node.
Về khía cạnh SEO, việc phân phối nội dung qua API của Strapi với kiến trúc HA giúp thời gian phản hồi (Response Time) giảm xuống mức tối thiểu, từ đó nâng cao điểm số Core Web Vitals cho các trang Front-end, gián tiếp cải thiện thứ hạng trên các công cụ tìm kiếm như Google.
5. Kết luận
Xây dựng hệ thống High Availability cho Strapi trên 3 VPS Hetzner kết hợp HAProxy đòi hỏi sự chuẩn bị kỹ lưỡng về mặt cấu hình mạng, đồng bộ lưu trữ và quản lý cơ sở dữ liệu. Tuy nhiên, thành quả đạt được là một hệ thống CMS vô cùng mạnh mẽ, có khả năng chịu lỗi cao, sẵn sàng phục vụ hàng triệu lượt truy cập và mang lại sự an tâm tuyệt đối cho doanh nghiệp trong hoạt động kinh doanh trực tuyến.
