Load Balancer HAProxy + Nginx Trên VPS: Cân Bằng Tải, Scale Ngang Website 2026

📅 05/2026 · ⏱ 9 phút đọc · 🏷 DevOps · High Availability

Website bạn đang phát triển, traffic tăng gấp đôi mỗi tháng. Một ngày đẹp trời, server sập vì quá tải — khách hàng không vào được, doanh thu = 0. Đây là lúc bạn cần load balancer. Không cần phần cứng đắt tiền, bạn có thể tự build load balancer với HAProxy + Nginx trên VPS giá rẻ. Bài viết này hướng dẫn từng bước.

🎯 Bạn sẽ học được: Cài HAProxy làm load balancer, cấu hình Nginx làm web server backend, health check tự động, SSL termination, sticky session, và scale ngang khi traffic tăng đột biến.

1. Load Balancer Là Gì? Tại Sao Cần?

Load balancer (cân bằng tải) là "người điều phối giao thông" cho website của bạn. Thay vì tất cả traffic đổ vào một server, load balancer phân phối đều qua nhiều backend server — giống như siêu thị mở thêm quầy thanh toán khi đông khách.

Không Có Load BalancerCó Load Balancer
1 server xử lý tất cả → dễ quá tảiN server chia tải → mỗi server nhàn hơn
Server chết → website down hoàn toàn1 server chết → traffic chuyển sang server còn lại
Scale dọc (nâng cấp server) — giới hạnScale ngang (thêm server) — gần như vô hạn
Bảo trì = downtimeBảo trì từng server một — zero downtime
Khó xử lý traffic spikeTự động phân phối khi traffic tăng đột biến

2. Kiến Trúc: HAProxy + Nginx Backend

Mô hình phổ biến nhất cho VPS giá rẻ:

Internet
   │
   ▼
┌──────────────────────┐
│  VPS 1: HAProxy      │  ← Load Balancer (40K-80K/tháng)
│  IP: 10.0.0.1        │
│  Port 80, 443        │
└──────┬───────┬───────┘
       │       │
       ▼       ▼
┌──────────┐ ┌──────────┐
│ VPS 2    │ │ VPS 3    │  ← Backend Web Servers (40K-80K/tháng mỗi cái)
│ Nginx    │ │ Nginx    │
│ PHP 8.2  │ │ PHP 8.2  │
│ Code     │ │ Code     │
└──────────┘ └──────────┘
       │       │
       ▼       ▼
┌──────────────────────┐
│  VPS 4: MySQL/MariaDB│  ← Database riêng (80K-200K/tháng)
│  Redis Cache         │
└──────────────────────┘

Tổng chi phí: 4 VPS × 40K-80K = 160K-320K/tháng — rẻ hơn nhiều so với một dedicated server (1-3 triệu/tháng) mà lại có high availability.

3. Cài Đặt HAProxy Load Balancer — Từng Bước

Bước 1: Chuẩn Bị VPS

Bạn cần ít nhất 3 VPS:

Tham khảo hướng dẫn thuê VPStop VPS giá rẻ để chọn provider phù hợp.

Bước 2: Cài HAProxy Trên VPS 1

# SSH vào VPS Load Balancer
ssh root@ip-vps-1

# Update & cài HAProxy
apt update && apt install haproxy -y

# Kiểm tra phiên bản
haproxy -v
# HAProxy version 2.8.x

Bước 3: Cấu Hình HAProxy

File cấu hình chính: /etc/haproxy/haproxy.cfg

global
    log /dev/log local0
    maxconn 4096
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    errorfile 400 /etc/haproxy/errors/400.http

# Frontend: nhận traffic từ Internet
frontend http_front
    bind *:80
    default_backend web_backends

# Backend: danh sách server xử lý
backend web_backends
    balance roundrobin
    option httpchk GET /health-check.php
    server web1 10.0.0.2:80 check inter 3000 rise 2 fall 3
    server web2 10.0.0.3:80 check inter 3000 rise 2 fall 3

Giải thích các tham số quan trọng:

Bước 4: Tạo Health Check Endpoint Trên Backend

Trên mỗi VPS backend, tạo file /var/www/html/health-check.php:

<?php
// Health check endpoint cho HAProxy
http_response_code(200);
header('Content-Type: application/json');
echo json_encode([
    'status' => 'ok',
    'server' => gethostname(),
    'time' => date('Y-m-d H:i:s')
]);

Bước 5: Khởi Động & Kiểm Tra

# Restart HAProxy
systemctl restart haproxy
systemctl enable haproxy

# Kiểm tra status
systemctl status haproxy

# Xem HAProxy stats (bật stats socket)
echo "show stat" | socat stdio /run/haproxy/admin.sock | head -5

# Test: curl vào IP load balancer
curl http://ip-vps-1/
# Sẽ thấy response từ 1 trong các backend server

4. Cấu Hình Nginx Trên Backend Server

Mỗi backend VPS chạy Nginx + PHP-FPM + code website của bạn. Cấu hình Nginx cơ bản:

# /etc/nginx/sites-available/website
server {
    listen 80;
    server_name _;
    root /var/www/html;

    index index.php index.html;

    # Gzip
    gzip on;
    gzip_types text/css application/javascript image/svg+xml;

    # PHP handler
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # Quan trọng: x-forwarded-for để backend biết IP thật của user
        fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
    }

    # Static files cache
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}
⚠️ Lưu ý quan trọng: Khi chạy sau load balancer, IP của request đến backend luôn là IP của HAProxy, không phải IP thật của user. Bạn phải cấu hình X-Forwarded-For để backend log và xử lý đúng IP thật. Xem thêm tại hướng dẫn reverse proxy Nginx.

5. SSL Termination Với HAProxy

Thay vì cài SSL trên từng backend server, bạn cài SSL tập trung tại HAProxy — gọi là SSL termination. Tiết kiệm công sức, dễ quản lý:

# Frontend HTTPS
frontend https_front
    bind *:443 ssl crt /etc/ssl/mcdhot.com.pem
    redirect scheme https if !{ ssl_fc }
    default_backend web_backends

# Cấu hình thêm X-Forwarded-Proto để backend biết request là HTTPS
backend web_backends
    balance roundrobin
    option forwardfor header X-Real-IP
    http-request set-header X-Forwarded-Proto https if { ssl_fc }
    option httpchk GET /health-check.php
    server web1 10.0.0.2:80 check
    server web2 10.0.0.3:80 check

Trong WordPress, thêm vào wp-config.php để nhận diện HTTPS đúng:

// Nhận diện HTTPS qua load balancer
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

6. Các Thuật Toán Cân Bằng Tải

HAProxy hỗ trợ nhiều thuật toán — chọn đúng cho use case của bạn:

Thuật ToánCách Hoạt ĐộngPhù Hợp Khi
roundrobinLuân phiên tuần tự giữa các serverCác server có cấu hình bằng nhau, request nhẹ
leastconnGửi đến server có ít kết nối nhấtRequest nặng, thời gian xử lý không đều
source (IP hash)Hash IP client → luôn vào cùng 1 serverCần sticky session (giỏ hàng, đăng nhập)
uriHash URL → request cùng URL vào cùng serverCaching hiệu quả, CDN origin
firstLuôn gửi đến server đầu tiên còn sốngActive-Passive failover

Ví dụ: Sticky Session Cho E-Commerce

Với website bán hàng, session (giỏ hàng, đăng nhập) phải luôn vào cùng một server. Dùng cookie-based sticky:

backend web_backends
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server web1 10.0.0.2:80 check cookie web1
    server web2 10.0.0.3:80 check cookie web2

7. Rate Limiting Và Bảo Vệ DDoS

Load balancer là tuyến phòng thủ đầu tiên. Cấu hình rate limiting để chống DDoS và bot:

# Frontend với rate limiting
frontend http_front
    bind *:80

    # Tạo stick-table để track IP
    stick-table type ip size 100k expire 30s store http_req_rate(10s)

    # Block nếu >100 requests/10 giây
    http-request track-sc0 src
    http-request deny if { sc_http_req_rate(0) gt 100 }

    default_backend web_backends

Kết hợp với rate limiting ở Nginx level để bảo vệ nhiều lớp.

8. Monitoring Load Balancer

HAProxy có built-in stats page để theo dõi realtime:

# Thêm vào haproxy.cfg
listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats auth admin:password_mạnh
    stats refresh 10s

Truy cập http://ip-load-balancer:8404/stats — nhập user/password — xem dashboard với traffic, connections, health status của từng backend.

Để monitoring chuyên nghiệp hơn, kết hợp Prometheus + Grafana hoặc Netdata.

9. So Sánh HAProxy vs Các Giải Pháp Khác

Giải PhápƯu ĐiểmNhược ĐiểmPhù Hợp
HAProxyNhẹ, nhanh, ổn định, Layer 4+7Cấu hình text-based, không có Web UI sẵnProduction, high traffic
NginxĐa năng (web server + LB), dễ cấu hìnhÍt tính năng LB chuyên sâu hơn HAProxyVừa làm web server vừa LB
TraefikAuto-discovery Docker/K8s, Web UI đẹpNặng hơn, phức tạp hơn cho non-containerDocker, Kubernetes, microservices
Cloudflare LBManaged, global anycast, DDoS protectionTốn phí ($5-10/tháng/nguồn), vendor lock-inGlobal traffic, không muốn tự quản lý

10. Chi Phí Triển Khai Load Balancer Với TrumVPS

Thành PhầnCấu HìnhGiá/Tháng
VPS Load Balancer2 CPU, 2GB RAM, 20GB SSD40.000đ
VPS Backend 12 CPU, 2GB RAM, 20GB SSD40.000đ
VPS Backend 22 CPU, 2GB RAM, 20GB SSD40.000đ
VPS Database (tùy chọn)4 CPU, 4GB RAM, 60GB SSD160.000đ
Tổng (không DB riêng)120.000đ/tháng
Tổng (có DB riêng)280.000đ/tháng

Với 120K/tháng, bạn có một hệ thống high availability, zero-downtime deployment, sẵn sàng xử lý traffic gấp 3-5 lần so với 1 VPS đơn lẻ. Rẻ hơn nhiều so với thuê managed load balancer (thường $20-50/tháng).

Triển Khai Load Balancer Chỉ Từ 120K/Tháng

3 VPS TrumVPS = High Availability cho website của bạn

🚀 Thuê VPS Ngay

11. Tổng Kết

Load balancer không còn là công nghệ "xa xỉ" chỉ dành cho doanh nghiệp lớn. Với VPS giá rẻ và HAProxy, bạn có thể tự build hệ thống cân bằng tải trong 1-2 giờ:

Xem thêm: DevOps workflow với VPS · Cài Docker Compose · Reverse Proxy Nginx · Chống DDoS với rate limiting · Tăng tốc website VPS