Scaling Website Với Netihot VPS 2026: Từ 100 Đến 100K Traffic Mỗi Ngày
Website bạn đang tăng traffic? Tuyệt! Nhưng VPS 80K/tháng chỉ chịu được ~500 user đồng thời. Khi traffic vượt ngưỡng, site bắt đầu lag, timeout, thậm chí sập. Đừng đợi đến lúc đó mới scaling. Bài này hướng dẫn lộ trình mở rộng hệ thống trên Netihot VPS — từ 1 VPS nhỏ đến hệ thống multi-server chịu 100K traffic/ngày.
1. Các Mức Traffic & Chiến Lược Scaling Tương Ứng
| Mức Traffic/Ngày | User Đồng Thời | Chiến Lược | Chi Phí/Tháng |
|---|---|---|---|
| 100 - 1.000 | 5-50 | 1 VPS 2GB RAM, LEMP stack cơ bản | 80K-150K |
| 1.000 - 10.000 | 50-200 | 1 VPS 4GB RAM + Redis cache + Cloudflare CDN | 200K-400K |
| 10.000 - 50.000 | 200-1.000 | 1 VPS 8-16GB RAM + Redis + CDN + tối ưu DB | 500K-1.5M |
| 50.000 - 100.000 | 1.000-3.000 | 2+ VPS (web + DB riêng) + Load Balancer | 2M-5M |
| 100.000+ | 3.000+ | Multi-server + Auto-scaling + DB replication | 5M-15M+ |
2. Giai Đoạn 1: Vertical Scaling — Nâng Cấp VPS Đơn
Vertical scaling là cách đơn giản nhất: tăng RAM, CPU, ổ cứng cho VPS hiện tại. Netihot cho phép nâng cấp gói VPS linh hoạt mà không cần migrate code.
# Trước khi nâng cấp: kiểm tra bottleneck
# Check RAM usage
free -h
# Check CPU load
top -bn1 | head -5
# Check MySQL slow queries
mysql -e "SHOW VARIABLES LIKE 'slow_query_log';"
mysql -e "SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 5;"
# Check ổ cứng
df -h
iostat -x 1 3
3. Giai Đoạn 2: Tách Database Ra VPS Riêng
Khi web app và database chung một VPS, chúng cạnh tranh RAM và I/O. Tách DB ra VPS riêng là bước đầu của horizontal scaling:
# Trên VPS DB (Netihot VPS 4GB RAM trở lên)
# Cài MySQL 8.0
sudo apt install mysql-server -y
sudo mysql_secure_installation
# Tạo user cho web server kết nối từ xa
sudo mysql -e "
CREATE USER 'webapp'@'WEB_SERVER_IP' IDENTIFIED BY 'StrongPassword2026!';
GRANT ALL PRIVILEGES ON webapp_db.* TO 'webapp'@'WEB_SERVER_IP';
FLUSH PRIVILEGES;
"
# Bind MySQL ra network nội bộ
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# bind-address = 0.0.0.0 (hoặc IP private)
sudo systemctl restart mysql
# Trên VPS Web: sửa config app trỏ sang VPS DB
# Ví dụ WordPress wp-config.php:
define('DB_HOST', 'PRIVATE_IP_VPS_DB');
4. Giai Đoạn 3: Load Balancer + Multi Web Server
Dùng HAProxy hoặc Nginx làm load balancer, phân phối traffic đều qua nhiều VPS web:
4.1. Cài HAProxy Trên VPS Load Balancer
# Cài HAProxy
sudo apt install haproxy -y
# Cấu hình
sudo nano /etc/haproxy/haproxy.cfg
frontend http_front
bind *:80
bind *:443 ssl crt /etc/ssl/mcdhot.pem
redirect scheme https if !{ ssl_fc }
default_backend web_backends
backend web_backends
balance roundrobin
option httpchk GET /health.php
server web1 10.0.1.10:80 check
server web2 10.0.1.11:80 check
server web3 10.0.1.12:80 check
sudo systemctl restart haproxy
4.2. Đồng Bộ File Giữa Các Web Server
# Dùng rsync + cron hoặc lsyncd
# Cài lsyncd trên VPS master
sudo apt install lsyncd -y
sudo nano /etc/lsyncd/lsyncd.conf.lua
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd-status.log"
}
sync {
default.rsync,
source = "/var/www/html/",
target = "10.0.1.11:/var/www/html/",
delay = 2,
rsync = {
archive = true, compress = true, verbose = true,
rsh = "/usr/bin/ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
}
}
sudo systemctl start lsyncd
5. Tối Ưu Hiệu Năng Cho Netihot VPS
5.1. Redis Cache (Giảm 80% DB Query)
# Cài Redis
sudo apt install redis-server -y
# WordPress: cài plugin Redis Object Cache
# Laravel: config/cache.php → driver = redis
# Custom PHP:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'page:home';
if ($redis->exists($cacheKey)) {
echo $redis->get($cacheKey);
} else {
ob_start();
// render page...
$html = ob_get_clean();
$redis->setex($cacheKey, 300, $html); // cache 5 phút
echo $html;
}
5.2. Cloudflare CDN + WAF
# 1. Trỏ DNS về Cloudflare
# 2. Bật proxy (orange cloud)
# 3. Cấu hình Page Rules:
# - Cache Everything cho static files (*.jpg, *.css, *.js)
# - Edge Cache TTL: 1 tháng
# 4. Bật WAF: block SQL injection, XSS, DDoS
5.3. Nginx Micro-caching
# /etc/nginx/sites-available/mysite
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 10m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
}
}
6. So Sánh Chi Phí Scaling: Netihot vs Cloud Lớn
| Giải Pháp | Cấu Hình | Giá/Tháng | Phù Hợp Traffic |
|---|---|---|---|
| Netihot VPS đơn | 4 CPU, 4GB RAM, NVMe | ~200K | 1K-10K/ngày |
| Netihot VPS mạnh | 8 CPU, 16GB RAM, NVMe | ~800K-1.2M | 10K-50K/ngày |
| Netihot 2 VPS (web+DB) | 2x 4GB RAM | ~400K-600K | 20K-80K/ngày |
| Netihot cluster (LB+3 web+DB) | 5 VPS | ~2M-4M | 100K-500K/ngày |
| AWS EC2 + RDS + ALB | t3.medium x3 + db.t4g.medium | ~$150-300 (3.7M-7.5M) | Tương đương |
7. Database Scaling: MySQL Replication Cho Reads
Khi database là bottleneck (thường xảy ra ở ~80K user), tách read/write là giải pháp:
# === TRÊN VPS DB MASTER (Write) ===
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = myapp_db
expire_logs_days = 7
max_binlog_size = 100M
sudo systemctl restart mysql
# Tạo replication user
sudo mysql -e "
CREATE USER 'repl'@'SLAVE_IP' IDENTIFIED BY 'ReplPass2026!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'SLAVE_IP';
FLUSH PRIVILEGES;
"
# Lấy vị trí binary log
sudo mysql -e "SHOW MASTER STATUS\G"
# Ghi nhớ: File (mysql-bin.000001), Position (1234)
# === TRÊN VPS DB SLAVE (Read) ===
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 2
read_only = 1
sudo systemctl restart mysql
sudo mysql -e "
CHANGE MASTER TO
MASTER_HOST='MASTER_IP',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass2026!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1234;
START SLAVE;
SHOW SLAVE STATUS\G
"
# === TRONG APP: Read từ Slave, Write vào Master ===
# Laravel example:
# config/database.php
'mysql' => [
'read' => ['host' => 'SLAVE_IP'],
'write' => ['host' => 'MASTER_IP'],
...
]
8. Auto-Scaling Trigger — Khi Nào Cần Thêm Server?
Cài đặt script đơn giản để tự động alert khi cần scale:
#!/bin/bash
# /usr/local/bin/scale-check.sh
# Chạy qua cron mỗi 5 phút
CPU_THRESHOLD=80
RAM_THRESHOLD=85
LOAD=$(uptime | awk -F'load average:' '{print $2}' | cut -d, -f1 | xargs)
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
RAM=$(free | grep Mem | awk '{printf "%.0f", $3/$2*100}')
ALERT=0
[ $(echo "$CPU > $CPU_THRESHOLD" | bc) -eq 1 ] && ALERT=1
[ $RAM -gt $RAM_THRESHOLD ] && ALERT=1
if [ $ALERT -eq 1 ]; then
curl -s -X POST "https://api.telegram.org/botYOUR_TOKEN/sendMessage" \
-d "chat_id=YOUR_CHAT_ID" \
-d "text=⚠️ Scale Alert! CPU: ${CPU}%, RAM: ${RAM}%, Load: ${LOAD}"
fi
# Crontab: */5 * * * * /usr/local/bin/scale-check.sh
9. Checklist Scaling — Làm Gì Trước Khi Traffic Tăng Đột Biến
- Tách DB riêng — DB là bottleneck số 1, tách sớm đỡ đau đầu
- Bật Redis — cache page, session, query results
- CDN cho static assets — Cloudflare free đủ cho 90% nhu cầu
- Tăng swap file — ít nhất 4GB để chống OOM kill
- Monitoring — cài Prometheus + Grafana để biết khi nào cần scale
- Backup tự động — trước khi scale luôn backup, lỡ có rollback
- Auto-scaling script — script tự động add web server khi CPU > 80%
🚀 Sẵn Sàng Cho Đợt Traffic Tiếp Theo?
Bắt đầu với Netihot VPS từ 80K/tháng. Nâng cấp linh hoạt khi traffic tăng — không mất công migrate.
Thuê VPS Netihot Ngay →Xem thêm: