Hướng Dẫn Deploy Website Lên VPS Từ A-Z Cho Người Mới Bắt Đầu (2026)

📅 05/2026 · ⏱ 20 phút đọc · 🏷 Hướng Dẫn

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.

1Mua VPS
2Domain & DNS
3Cài LEMP
4Deploy Code
5SSL & Bảo Mật
6Auto Deploy

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ó:

  1. 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.
  2. Tên miền: Đã mua từ nhà đăng ký (Pavietnam, Mắt Bão, Namecheap...).
  3. Terminal: Trên Windows: tải Windows Terminal hoặc PuTTY. Trên Mac/Linux: Terminal có sẵn.
  4. 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:

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:

  1. Trình duyệt hỏi DNS server: "IP của yourdomain.com là gì?"
  2. DNS server trả lời: "Là 123.45.67.89"
  3. 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:

TypeName/HostValue/Points ToTTL
A@123.45.67.893600
Awww123.45.67.893600

Giải thích:

⏳ 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.

💡 Mẹo: Nếu bạn dùng Cloudflare (miễn phí), hãy trỏ nameserver về Cloudflare trước, rồi quản lý DNS trên Cloudflare. Cloudflare cung cấp CDN + DDoS protection miễn phí, và DNS propagate nhanh hơn (thường 1-2 phút).

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:

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
🔒 Mẹo bảo mật thêm: Sau khi cài SSL, thêm HTTP Strict Transport Security (HSTS) vào Nginx config để browser luôn dùng HTTPS: 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
⚠️ Quan trọng: Kiểm tra user 'deploy' có thể SSH vào trước khi tắt root login! Mở 2 terminal: 1 giữ session root, 1 test user mới. Nếu user mới OK thì mới tắt root.

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
💡 Nâng cao: Dùng 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 HostingTự Deploy VPS
Độ khó ban đầuDễ — upload file, bấm càiTrung bình — cần 2-3 tiếng lần đầu
Tốc độChậm — chia sẻ tài nguyênNhanh — tài nguyên riêng
Tùy chỉnhKhông — bị giới hạnToàn quyền — cài gì cũng được
Chi phí14K-100K/tháng40K-160K/tháng (TrumVPS)
Bảo mậtPhụ thuộc nhà cung cấpTự kiểm soát 100%
Học được gìGần như khôngLinux, server, DevOps — kỹ năng giá trị
Phù hợpWebsite cá nhân, blog nhỏWebsite kinh doanh, app, SaaS

Checklist: Những Việc Cần Làm Sau Khi Deploy

  1. ☑ Đổi mật khẩu root
  2. ☑ Tạo user thường, không dùng root
  3. ☑ Cài firewall (UFW) — chỉ mở port 22, 80, 443
  4. ☑ Cài fail2ban chống brute force
  5. ☑ Cài SSL Let's Encrypt — tự động gia hạn
  6. ☑ Setup backup database + files hàng ngày
  7. ☑ Xóa file info.php, phpmyadmin (nếu có cài)
  8. ☑ Vô hiệu hóa XML-RPC nếu dùng WordPress (trừ khi cần)
  9. ☑ Cập nhật hệ thống định kỳ: apt update && apt upgrade -y
  10. ☑ 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 Ngay

Cầ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.