Cách cài đặt VPS từ con số 0 đến production-ready là kỹ năng mà mọi developer, sysadmin, và thậm chí chủ doanh nghiệp SME nên hiểu cơ bản. Bài viết này hướng dẫn bạn từng bước setup VPS Ubuntu 22.04 LTS + Nginx — stack phổ biến nhất cho website doanh nghiệp tại Việt Nam. Theo khảo sát W3Techs (2025), Nginx chiếm 34% thị phần web server toàn cầu, và Ubuntu là hệ điều hành phổ biến nhất cho VPS với 47% thị phần.
Lead magnet: Tải miễn phí VPS Setup Checklist: 50 bước từ 0 đến production-ready — checklist chi tiết bạn có thể in ra và tick từng bước.
Chuẩn bị trước khi bắt đầu
Yêu cầu
- VPS: Tối thiểu 1GB RAM, 1 vCPU, 25GB SSD (khuyến nghị 2GB RAM cho production)
- Hệ điều hành: Ubuntu 22.04 LTS (Long Term Support đến 2027)
- Domain: Đã trỏ DNS A record về IP VPS
- Máy local: Terminal (Mac/Linux) hoặc PuTTY/Windows Terminal (Windows)
- Thời gian: Khoảng 60–90 phút cho lần đầu
Tại sao chọn Ubuntu 22.04 LTS + Nginx?
| Lý do | Chi tiết |
|---|---|
| LTS = ổn định | Hỗ trợ bảo mật 5 năm (đến 2027), không cần upgrade liên tục |
| Cộng đồng lớn | Gặp lỗi gì cũng Google được giải pháp |
| Nginx nhanh | Xử lý concurrent connections tốt hơn Apache 2–3 lần |
| Ít tốn RAM | Nginx dùng ít RAM hơn Apache, phù hợp VPS nhỏ |
| Reverse proxy | Nginx làm reverse proxy tuyệt vời cho Node.js, Python |
Phần 1: Kết nối và bảo mật cơ bản
Bước 1: SSH vào VPS lần đầu
Sau khi tạo VPS, bạn sẽ nhận được IP address và root password (qua email hoặc dashboard).
# Từ máy local, kết nối SSH
ssh root@YOUR_SERVER_IP
# Nhập password khi được hỏi
Với Windows, mở Windows Terminal hoặc PowerShell:
ssh root@YOUR_SERVER_IP
Bước 2: Cập nhật hệ thống
Việc đầu tiên luôn là cập nhật tất cả packages:
apt update && apt upgrade -y
Lệnh này sẽ:
apt update: Cập nhật danh sách packages mới nhấtapt upgrade -y: Cài đặt tất cả bản cập nhật (kể cả bảo mật)
Bước 3: Tạo user mới (không dùng root)
Không bao giờ dùng root cho công việc hàng ngày. Tạo user riêng:
# Tạo user mới
adduser deploy
# Thêm user vào nhóm sudo
usermod -aG sudo deploy
Nhập password mạnh (tối thiểu 16 ký tự, bao gồm chữ hoa, chữ thường, số, ký tự đặc biệt).
Bước 4: Setup SSH Key Authentication
SSH key an toàn hơn password gấp nhiều lần. Trên máy local của bạn:
# Tạo SSH key pair (nếu chưa có)
ssh-keygen -t ed25519 -C "[email protected]"
# Copy public key lên VPS
ssh-copy-id deploy@YOUR_SERVER_IP
Với Windows, nếu ssh-copy-id không có sẵn:
# Đọc public key
type $env:USERPROFILE\.ssh\id_ed25519.pub
# Copy nội dung, rồi trên VPS:
mkdir -p /home/deploy/.ssh
echo "PASTE_PUBLIC_KEY_HERE" >> /home/deploy/.ssh/authorized_keys
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
Bước 5: Tắt đăng nhập root và password qua SSH
sudo nano /etc/ssh/sshd_config
Tìm và sửa các dòng:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Restart SSH service:
sudo systemctl restart sshd
⚠️ Quan trọng: Trước khi tắt password authentication, hãy mở một terminal mới và thử SSH bằng key để chắc chắn nó hoạt động. Nếu key không work mà bạn đã tắt password, bạn sẽ bị lock out khỏi server.
Bước 6: Cấu hình Firewall (UFW)
# Cho phép SSH
sudo ufw allow OpenSSH
# Cho phép HTTP và HTTPS
sudo ufw allow 'Nginx Full'
# Bật firewall
sudo ufw enable
# Kiểm tra trạng thái
sudo ufw status
Kết quả mong đợi:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
Bước 7: Cài đặt Fail2Ban
Fail2Ban tự động chặn IP sau nhiều lần đăng nhập sai:
sudo apt install fail2ban -y
# Tạo file cấu hình local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Thêm/sửa trong section [sshd]:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Phần 2: Cài đặt Nginx
Bước 8: Cài Nginx
sudo apt install nginx -y
# Kiểm tra Nginx đã chạy
sudo systemctl status nginx
Mở trình duyệt và truy cập http://YOUR_SERVER_IP — bạn sẽ thấy trang mặc định “Welcome to nginx!”
Bước 9: Cấu hình Nginx cho website
Tạo file cấu hình cho domain:
sudo nano /etc/nginx/sites-available/yourdomain.com
Nội dung cơ bản:
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com/html;
index index.html index.htm index.php;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
location / {
try_files $uri $uri/ =404;
}
# Deny access to hidden files
location ~ /\. {
deny all;
}
# Cache static files
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
access_log /var/log/nginx/yourdomain.com.access.log;
error_log /var/log/nginx/yourdomain.com.error.log;
}
Bước 10: Kích hoạt cấu hình
# Tạo symbolic link
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
# Tạo thư mục web root
sudo mkdir -p /var/www/yourdomain.com/html
# Tạo trang index test
echo "<h1>VPS Setup Successful!</h1>" | sudo tee /var/www/yourdomain.com/html/index.html
# Set quyền sở hữu
sudo chown -R www-data:www-data /var/www/yourdomain.com
# Test cấu hình Nginx
sudo nginx -t
# Reload Nginx
sudo systemctl reload nginx
Bước 11: Tối ưu Nginx Performance
sudo nano /etc/nginx/nginx.conf
Các thông số cần tối ưu:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
# Basic settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 64M;
# Gzip compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types
application/javascript
application/json
application/xml
text/css
text/plain
text/xml
image/svg+xml;
# Security
server_tokens off;
}
Phần 3: Cài đặt PHP (cho WordPress/Laravel)
Bước 12: Cài PHP 8.3 và extensions
# Thêm PHP repository
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Cài PHP-FPM và extensions phổ biến
sudo apt install php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd \
php8.3-intl php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath \
php8.3-redis php8.3-imagick -y
Bước 13: Cấu hình PHP-FPM
sudo nano /etc/php/8.3/fpm/php.ini
Các thông số cần thay đổi:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
max_input_vars = 5000
date.timezone = Asia/Ho_Chi_Minh
# OPcache - cực kỳ quan trọng cho performance
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
sudo systemctl restart php8.3-fpm
Bước 14: Cấu hình Nginx cho PHP
Cập nhật file cấu hình Nginx:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# Timeout settings
fastcgi_connect_timeout 60;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
# Buffer settings
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
}
location ~ /\.ht {
deny all;
}
}
Phần 4: Cài đặt MySQL/MariaDB
Bước 15: Cài MariaDB
sudo apt install mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadb
Bước 16: Bảo mật MySQL
sudo mysql_secure_installation
Trả lời các câu hỏi:
- Switch to unix_socket authentication? Y
- Change root password? Y (đặt password mạnh)
- Remove anonymous users? Y
- Disallow root login remotely? Y
- Remove test database? Y
- Reload privilege tables? Y
Bước 17: Tạo database và user cho website
sudo mysql -u root -p
-- Tạo database
CREATE DATABASE website_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Tạo user riêng (KHÔNG DÙNG ROOT)
CREATE USER 'website_user'@'localhost' IDENTIFIED BY 'StrongPassword123!@#';
-- Cấp quyền
GRANT ALL PRIVILEGES ON website_db.* TO 'website_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Lưu ý: Charset utf8mb4 hỗ trợ tiếng Việt và emoji đầy đủ. Luôn dùng utf8mb4 thay vì utf8.
Phần 5: SSL Certificate với Let’s Encrypt
Bước 18: Cài Certbot
sudo apt install certbot python3-certbot-nginx -y
Bước 19: Cấp SSL certificate
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot sẽ:
- Xác minh bạn sở hữu domain
- Tải và cài certificate
- Tự động cấu hình Nginx cho HTTPS
- Setup auto-renew (tự gia hạn)
Bước 20: Kiểm tra auto-renew
# Test renew
sudo certbot renew --dry-run
# Kiểm tra timer tự động
sudo systemctl status certbot.timer
Let’s Encrypt certificate có hiệu lực 90 ngày. Certbot tự động gia hạn khi còn 30 ngày — bạn không cần làm gì thêm.
Phần 6: Các công cụ bổ trợ quan trọng
Bước 21: Cài đặt Redis (caching)
sudo apt install redis-server -y
# Cấu hình Redis sử dụng memory hiệu quả
sudo nano /etc/redis/redis.conf
Sửa:
maxmemory 128mb
maxmemory-policy allkeys-lru
supervised systemd
sudo systemctl restart redis-server
Bước 22: Setup swap file
Với VPS 1–2GB RAM, swap file giúp tránh out-of-memory:
# Tạo swap file 2GB
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Thêm vào fstab để tự mount khi reboot
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# Tối ưu swappiness
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Bước 23: Cài đặt monitoring cơ bản
# htop - monitor real-time
sudo apt install htop -y
# vnstat - monitor bandwidth
sudo apt install vnstat -y
# ncdu - phân tích dung lượng ổ cứng
sudo apt install ncdu -y
Bước 24: Setup automatic security updates
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
Phần 7: Backup và bảo mật nâng cao
Bước 25: Setup backup script tự động
sudo nano /opt/backup.sh
#!/bin/bash
# Backup script cho VPS
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backups"
WEBSITE_DIR="/var/www"
DB_USER="website_user"
DB_PASS="StrongPassword123!@#"
DB_NAME="website_db"
RETENTION_DAYS=30
mkdir -p $BACKUP_DIR
# Backup database
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Backup website files
tar czf $BACKUP_DIR/files_$DATE.tar.gz $WEBSITE_DIR
# Xóa backup cũ hơn 30 ngày
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $DATE"
sudo chmod +x /opt/backup.sh
# Chạy tự động mỗi ngày lúc 3h sáng
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1") | crontab -
Bước 26: Hardening bổ sung
# Đổi SSH port (tùy chọn)
sudo nano /etc/ssh/sshd_config
# Thay đổi: Port 2222
# Cập nhật UFW
sudo ufw delete allow OpenSSH
sudo ufw allow 2222/tcp
sudo systemctl restart sshd
# Giới hạn số kết nối đồng thời
sudo nano /etc/nginx/nginx.conf
# Thêm trong http block:
# limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
Checklist tổng hợp: VPS Setup từ 0 đến Production
| # | Hạng mục | Trạng thái |
|---|---|---|
| 1 | SSH vào VPS | ☐ |
| 2 | Cập nhật hệ thống (apt update/upgrade) | ☐ |
| 3 | Tạo user mới, không dùng root | ☐ |
| 4 | Setup SSH key authentication | ☐ |
| 5 | Tắt root login & password auth | ☐ |
| 6 | Cấu hình UFW firewall | ☐ |
| 7 | Cài Fail2Ban | ☐ |
| 8 | Cài Nginx | ☐ |
| 9 | Cấu hình Nginx cho domain | ☐ |
| 10 | Tối ưu Nginx performance | ☐ |
| 11 | Cài PHP-FPM + extensions | ☐ |
| 12 | Tối ưu php.ini | ☐ |
| 13 | Cài MariaDB/MySQL | ☐ |
| 14 | Bảo mật MySQL | ☐ |
| 15 | Tạo database + user | ☐ |
| 16 | Cài SSL (Let’s Encrypt) | ☐ |
| 17 | Verify auto-renew SSL | ☐ |
| 18 | Cài Redis | ☐ |
| 19 | Setup swap file | ☐ |
| 20 | Cài monitoring tools | ☐ |
| 21 | Setup automatic updates | ☐ |
| 22 | Setup backup script | ☐ |
| 23 | Test backup & restore | ☐ |
| 24 | Hardening bổ sung | ☐ |
| 25 | Deploy website | ☐ |
So sánh thời gian setup: Tự làm vs Thuê chuyên gia
| Hạng mục | Tự làm (lần đầu) | Tự làm (có kinh nghiệm) | Thuê chuyên gia |
|---|---|---|---|
| Setup cơ bản | 4–8 giờ | 1–2 giờ | 2–4 giờ |
| Bảo mật nâng cao | 2–4 giờ | 30 phút | 1–2 giờ |
| Tối ưu performance | 2–4 giờ | 30 phút | 1–2 giờ |
| Migration website | 2–8 giờ | 1–2 giờ | 1–3 giờ |
| Tổng | 10–24 giờ | 3–5 giờ | 5–11 giờ |
| Chi phí | 0 VND (nhưng tốn thời gian) | 0 VND | 2–10 triệu VND |
Troubleshooting: Các lỗi thường gặp
Lỗi 1: “Permission denied (publickey)”
Nguyên nhân: SSH key chưa được copy đúng hoặc quyền file sai.
Cách sửa:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Lỗi 2: Nginx trả về 502 Bad Gateway
Nguyên nhân: PHP-FPM không chạy hoặc socket path sai.
Cách sửa:
sudo systemctl status php8.3-fpm
sudo systemctl restart php8.3-fpm
# Kiểm tra socket path trong Nginx config khớp với PHP-FPM config
Lỗi 3: MySQL “Access denied for user”
Nguyên nhân: Password sai hoặc user chưa có quyền.
Cách sửa:
sudo mysql -u root -p
GRANT ALL PRIVILEGES ON website_db.* TO 'website_user'@'localhost';
FLUSH PRIVILEGES;
Lỗi 4: Website chậm dù VPS mạnh
Checklist kiểm tra:
- OPcache đã bật chưa? (
php -m | grep opcache) - Redis đã hoạt động chưa? (
redis-cli ping) - Gzip compression đã bật chưa?
- Database có index đúng chưa?
- PHP memory_limit đủ chưa?
Kết luận
Cài đặt VPS Ubuntu + Nginx không quá khó nếu bạn làm theo từng bước. Bài viết này cover từ kết nối SSH đến bảo mật, từ cài Nginx đến SSL — đủ để đưa website lên production an toàn.
Tuy nhiên, nếu bạn không quen với Linux hoặc muốn tập trung vào kinh doanh thay vì quản trị server, hãy cân nhắc dịch vụ xây dựng hệ thống của Trinh Digital. Chúng tôi setup VPS tối ưu, bảo mật theo chuẩn, kèm monitoring 24/7 — để bạn yên tâm kinh doanh.