Hướng Dẫn Deploy Website Lên VPS Từ A-Z Cho Người Mới Bắt Đầu (2026)
Bạn vừa mua VPS đầu tiên. Màn hình đen xì với dòng root@vps:~# hiện ra. Bạn hoang mang: "Làm sao để đưa website lên đây?" Đừng lo — bài viết này sẽ dắt tay bạn từng bước, từ lúc VPS còn "trần trụi" chưa cài gì, đến khi có một website chạy ngon lành với HTTPS, tự động deploy, backup hàng ngày.
Toàn bộ hướng dẫn được test trên VPS TrumVPS 40K/tháng (1GB RAM, Ubuntu 22.04) — chứng minh rằng chỉ với 40K, bạn hoàn toàn có thể host website chuyên nghiệp. Không cần biết Linux trước, không cần kinh nghiệm server. Chỉ cần làm theo từng bước.
Bước 0: Chuẩn Bị — Bạn Cần Những Gì?
Trước khi bắt đầu, hãy chắc chắn bạn có:
- VPS: Một VPS đã được kích hoạt, chạy Ubuntu 22.04 hoặc 24.04. Nếu chưa có, thuê VPS TrumVPS từ 40K.
- Tên miền: Đã mua từ nhà đăng ký (Pavietnam, Mắt Bão, Namecheap...).
- Terminal: Trên Windows: tải Windows Terminal hoặc PuTTY. Trên Mac/Linux: Terminal có sẵn.
- Code website: Code đã sẵn sàng để upload (có thể là WordPress, Laravel, HTML tĩnh...).
Bước 1: Kết Nối SSH Vào VPS Lần Đầu
Sau khi mua VPS, bạn nhận được email gồm:
- IP: Ví dụ
123.45.67.89 - Username:
root - Password: Mật khẩu tạm (hoặc SSH key nếu bạn chọn)
Mở Terminal (hoặc PuTTY trên Windows) và gõ:
ssh root@123.45.67.89
Lần đầu kết nối, nó sẽ hỏi Are you sure you want to continue connecting (yes/no)? → gõ yes → Enter → nhập password.
Việc đầu tiên sau khi login: Đổi mật khẩu root và cập nhật hệ thống:
passwd
# Nhập mật khẩu mới (mạnh: ít nhất 12 ký tự, có chữ hoa, chữ thường, số, ký tự đặc biệt)
apt update && apt upgrade -y
Bước 2: Domain & DNS — Trỏ Tên Miền Về VPS
Bạn đã có VPS với IP 123.45.67.89. Giờ cần cho thế giới biết yourdomain.com trỏ về IP đó.
2.1. Cách DNS Hoạt Động (Giải Thích Ngắn Gọn)
Khi ai đó gõ yourdomain.com vào trình duyệt:
- Trình duyệt hỏi DNS server: "IP của yourdomain.com là gì?"
- DNS server trả lời: "Là 123.45.67.89"
- Trình duyệt kết nối tới 123.45.67.89 và yêu cầu trang web
Việc của bạn: cấu hình DNS record cho tên miền trỏ về IP VPS.
2.2. Tạo DNS Records
Vào trang quản lý DNS của nhà đăng ký tên miền (Pavietnam, Mắt Bão, Namecheap...). Tìm mục DNS Management hoặc Nameserver. Tạo các record sau:
| Type | Name/Host | Value/Points To | TTL |
|---|---|---|---|
| A | @ | 123.45.67.89 | 3600 |
| A | www | 123.45.67.89 | 3600 |
Giải thích:
- A record @: Trỏ
yourdomain.com(không có www) về IP VPS - A record www: Trỏ
www.yourdomain.comvề IP VPS - TTL 3600: DNS cache 1 giờ. Sau này khi site ổn định có thể tăng lên 86400 (24h)
⏳ DNS mất 5-30 phút để propagate (lan truyền). Trong lúc chờ, bạn có thể làm tiếp các bước dưới.
Bước 3: Cài Đặt LEMP Stack (Nginx + PHP + MySQL)
LEMP = Linux + Nginx (phát âm "Engine X" → chữ E) + MySQL/MariaDB + PHP. Đây là bộ công cụ chạy 90% website hiện nay.
3.1. Cài Nginx
apt install nginx -y
systemctl enable nginx
systemctl start nginx
Sau khi cài, mở trình duyệt gõ http://123.45.67.89 (IP VPS). Bạn sẽ thấy trang "Welcome to nginx!" — chúc mừng, web server đã chạy!
3.2. Cài MariaDB (MySQL)
apt install mariadb-server -y
systemctl enable mariadb
systemctl start mariadb
# Bảo mật MySQL
mysql_secure_installation
# Trả lời: Enter (không có password) → Y (set root password) → nhập password mới
# → Y (remove anonymous users) → Y (disallow root remote) → Y (remove test DB) → Y (reload)
3.3. Cài PHP 8.2
apt install php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd \
php8.2-mbstring php8.2-xml php8.2-zip php8.2-bcmath \
php8.2-imagick php8.2-intl php8.2-redis -y
systemctl enable php8.2-fpm
systemctl start php8.2-fpm
Kiểm tra PHP đã chạy:
php -v
# PHP 8.2.x (cli) ...
Bước 4: Cấu Hình Nginx Cho Website Đầu Tiên
4.1. Tạo Thư Mục Website
mkdir -p /var/www/yourdomain.com
chown -R www-data:www-data /var/www/yourdomain.com
4.2. Tạo File Cấu Hình Nginx
nano /etc/nginx/sites-available/yourdomain.com
Dán nội dung sau (thay yourdomain.com bằng tên miền của bạn):
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com;
index index.php index.html index.htm;
# Log files
access_log /var/log/nginx/yourdomain.com-access.log;
error_log /var/log/nginx/yourdomain.com-error.log;
# PHP handler
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Block access to hidden files
location ~ /\. {
deny all;
}
# Static files — cache 30 days
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
4.3. Kích Hoạt Site
ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
nginx -t # Test cấu hình
systemctl reload nginx # Áp dụng
4.4. Test Với File PHP Đơn Giản
echo "<?php phpinfo(); ?>" > /var/www/yourdomain.com/info.php
Mở trình duyệt: http://yourdomain.com/info.php → thấy bảng PHP info màu tím → thành công!
Nhớ xóa file info.php sau khi test — để lộ thông tin server là lỗ hổng bảo mật:
rm /var/www/yourdomain.com/info.php
Bước 5: Upload Code Website Lên VPS
Có 5 cách để đưa code lên VPS. Chọn cách phù hợp với bạn:
Cách 1: Git Clone (Khuyên Dùng Cho Developer)
cd /var/www/yourdomain.com
apt install git -y
git clone https://github.com/yourusername/your-repo.git .
# Nếu là private repo: git clone https://username:token@github.com/your/repo.git .
Ưu điểm: Deploy sau này chỉ cần git pull. Có thể tự động hóa với GitHub Actions.
Cách 2: SCP / SFTP (Dùng FileZilla, WinSCP)
Tải FileZilla (Windows/Mac/Linux miễn phí). Điền:
- Host:
sftp://123.45.67.89 - Username:
root - Password: (mật khẩu root VPS)
- Port:
22
Kéo thả file từ máy tính sang thư mục /var/www/yourdomain.com trên VPS.
Cách 3: rsync (Cho Developer Command Line)
# Từ máy local:
rsync -avz -e ssh /path/to/local/code/ root@123.45.67.89:/var/www/yourdomain.com/
rsync chỉ upload file thay đổi → nhanh hơn SCP rất nhiều khi deploy thường xuyên.
Cách 4: zip + wget (Nếu Code Đang Ở Đâu Đó Trên Internet)
# Trên VPS:
cd /var/www/yourdomain.com
wget https://example.com/your-code.zip
unzip your-code.zip
rm your-code.zip
Cách 5: WordPress — Tự Động Cài Qua WP-CLI
Nếu bạn deploy WordPress, dùng WP-CLI cho nhanh:
# Cài WP-CLI
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
# Tải WordPress
cd /var/www/yourdomain.com
wp core download --locale=vi
# Tạo database
mysql -u root -p
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'm@tKhau_M@nh!2026';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# Cấu hình WordPress
wp config create --dbname=wordpress --dbuser=wpuser --dbpass='m@tKhau_M@nh!2026'
wp core install --url=https://yourdomain.com --title="Tên Website" --admin_user=admin --admin_password='M@tKhauAdmin!' --admin_email=admin@yourdomain.com
Bước 6: Cài SSL Miễn Phí Với Let's Encrypt
Website không có HTTPS → Google đánh dấu "không an toàn" → mất trust, mất SEO. Cài SSL miễn phí với Certbot:
apt install certbot python3-certbot-nginx -y
certbot --nginx -d yourdomain.com -d www.yourdomain.com
# Nhập email → đồng ý ToS → chọn (2) Redirect HTTP → HTTPS
Certbot tự động cấu hình Nginx và gia hạn SSL. Kiểm tra tự động gia hạn:
certbot renew --dry-run
# Nếu output là "Congratulations, all renewals succeeded" → OK
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;Bước 7: Bảo Mật VPS Cơ Bản (Đừng Bỏ Qua!)
Một VPS mới tinh không được bảo vệ là miếng mồi ngon cho hacker. Những bước cơ bản nhất định phải làm:
7.1. Tạo User Riêng (Không Dùng Root)
adduser deploy
usermod -aG sudo deploy
# Từ giờ SSH bằng user 'deploy' thay vì root
7.2. Cài Fail2ban — Chống Brute Force
apt install fail2ban -y
systemctl enable fail2ban
Fail2ban tự động chặn IP sau 5 lần đăng nhập sai. Mặc định là đủ dùng, không cần cấu hình thêm.
7.3. Cấu Hình Firewall (UFW)
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw enable
ufw status # Kiểm tra
7.4. Tắt Đăng Nhập Root Qua SSH
nano /etc/ssh/sshd_config
# Sửa: PermitRootLogin no
# Sửa: PasswordAuthentication no (nếu đã setup SSH key)
systemctl restart sshd
Bước 8: Tự Động Deploy — Mỗi Lần Push Code Là Website Tự Cập Nhật
Nếu bạn dùng Git, hãy thiết lập tự động deploy để tiết kiệm thời gian:
8.1. Deploy Script Đơn Giản
nano /home/deploy/deploy.sh
#!/bin/bash
cd /var/www/yourdomain.com
git pull origin main
# Nếu dùng PHP composer:
# composer install --no-dev --optimize-autoloader
# Nếu dùng Node.js:
# npm ci --production
# Nếu dùng Laravel:
# php artisan migrate --force
# php artisan config:cache
# php artisan route:cache
# php artisan view:cache
echo "$(date): Deploy done" >> /var/log/deploy.log
chmod +x /home/deploy/deploy.sh
8.2. Deploy Key + GitHub Webhook (Tự Động Khi Push)
Tạo SSH key cho deploy:
ssh-keygen -t ed25519 -C "deploy@yourdomain.com" -f /home/deploy/.ssh/deploy_key
# Copy public key → thêm vào GitHub repo Settings → Deploy Keys
cat /home/deploy/.ssh/deploy_key.pub
Sau đó tạo một webhook.php đơn giản để GitHub gọi khi push:
nano /var/www/yourdomain.com/deploy-webhook.php
<?php
$secret = 'YOUR_GITHUB_WEBHOOK_SECRET';
$signature = 'sha1=' . hash_hmac('sha1', file_get_contents('php://input'), $secret);
if (hash_equals($signature, $_SERVER['HTTP_X_HUB_SIGNATURE'] ?? '')) {
shell_exec('/home/deploy/deploy.sh > /dev/null 2>&1 &');
http_response_code(200);
echo 'Deploy triggered';
} else {
http_response_code(403);
echo 'Invalid signature';
}
Vào GitHub repo → Settings → Webhooks → Add webhook → Payload URL: https://yourdomain.com/deploy-webhook.php → Secret: (cùng secret trong code) → Chọn "Just the push event".
Từ giờ, mỗi lần push code lên GitHub → webhook gọi → VPS tự động pull code mới.
Bước 9: Backup Tự Động Hàng Ngày
Server có thể die bất cứ lúc nào. Backup là bảo hiểm duy nhất:
9.1. Backup Database
nano /home/deploy/backup-db.sh
#!/bin/bash
BACKUP_DIR=/home/deploy/backups/db
DB_NAME=wordpress
DB_USER=wpuser
DB_PASS='m@tKhau_M@nh!2026'
RETENTION=7 # Giữ 7 bản gần nhất
mkdir -p $BACKUP_DIR
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db-$(date +%Y%m%d).sql.gz
# Xóa backup cũ hơn 7 ngày
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION -delete
9.2. Backup Files
nano /home/deploy/backup-files.sh
#!/bin/bash
tar -czf /home/deploy/backups/files/files-$(date +%Y%m%d).tar.gz /var/www/yourdomain.com
find /home/deploy/backups/files -name "*.tar.gz" -mtime +7 -delete
9.3. Cron Job Chạy Hàng Ngày
chmod +x /home/deploy/backup-*.sh
crontab -e
# Thêm vào:
0 3 * * * /home/deploy/backup-db.sh # Backup DB lúc 3:00 AM
30 3 * * * /home/deploy/backup-files.sh # Backup files lúc 3:30 AM
rclone để sync backup lên Google Drive, Dropbox, hoặc Nextcloud Storage Netihot — bảo vệ dữ liệu ngay cả khi server bị xóa sạch. Xem hướng dẫn backup lên Google Drive.So Sánh: Shared Hosting vs Tự Deploy Trên VPS
| Tiêu chí | Shared Hosting | Tự Deploy VPS |
|---|---|---|
| Độ khó ban đầu | Dễ — upload file, bấm cài | Trung bình — cần 2-3 tiếng lần đầu |
| Tốc độ | Chậm — chia sẻ tài nguyên | Nhanh — tài nguyên riêng |
| Tùy chỉnh | Không — bị giới hạn | Toàn quyền — cài gì cũng được |
| Chi phí | 14K-100K/tháng | 40K-160K/tháng (TrumVPS) |
| Bảo mật | Phụ thuộc nhà cung cấp | Tự kiểm soát 100% |
| Học được gì | Gần như không | Linux, server, DevOps — kỹ năng giá trị |
| Phù hợp | Website cá nhân, blog nhỏ | Website kinh doanh, app, SaaS |
Checklist: Những Việc Cần Làm Sau Khi Deploy
- ☑ Đổi mật khẩu root
- ☑ Tạo user thường, không dùng root
- ☑ Cài firewall (UFW) — chỉ mở port 22, 80, 443
- ☑ Cài fail2ban chống brute force
- ☑ Cài SSL Let's Encrypt — tự động gia hạn
- ☑ Setup backup database + files hàng ngày
- ☑ Xóa file info.php, phpmyadmin (nếu có cài)
- ☑ Vô hiệu hóa XML-RPC nếu dùng WordPress (trừ khi cần)
- ☑ Cập nhật hệ thống định kỳ:
apt update && apt upgrade -y - ☑ Monitoring: cài Netdata hoặc Uptime Kuma
Sẵn Sàng Deploy Website Đầu Tiên?
VPS TrumVPS — từ 40K/tháng, NVMe SSD, kích hoạt trong 5 phút
🚀 Thuê VPS TrumVPS NgayCần hosting đơn giản hơn? Netihot có Hosting từ 10K/tháng — cPanel, SSL free, dùng ngay không cần cài đặt.