T
Trinh Digital
Xây dựng Hệ thống

Hướng dẫn cài đặt VPS Ubuntu + Nginx cho website (từng bước)

Trinh Digital · · 13 phút đọc

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ý doChi tiết
LTS = ổn địnhHỗ trợ bảo mật 5 năm (đến 2027), không cần upgrade liên tục
Cộng đồng lớnGặp lỗi gì cũng Google được giải pháp
Nginx nhanhXử lý concurrent connections tốt hơn Apache 2–3 lần
Ít tốn RAMNginx dùng ít RAM hơn Apache, phù hợp VPS nhỏ
Reverse proxyNginx 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ất
  • apt 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ụcTrạng thái
1SSH vào VPS
2Cập nhật hệ thống (apt update/upgrade)
3Tạo user mới, không dùng root
4Setup SSH key authentication
5Tắt root login & password auth
6Cấu hình UFW firewall
7Cài Fail2Ban
8Cài Nginx
9Cấu hình Nginx cho domain
10Tối ưu Nginx performance
11Cài PHP-FPM + extensions
12Tối ưu php.ini
13Cài MariaDB/MySQL
14Bảo mật MySQL
15Tạo database + user
16Cài SSL (Let’s Encrypt)
17Verify auto-renew SSL
18Cài Redis
19Setup swap file
20Cài monitoring tools
21Setup automatic updates
22Setup backup script
23Test backup & restore
24Hardening bổ sung
25Deploy website

So sánh thời gian setup: Tự làm vs Thuê chuyên gia

Hạng mụcTự làm (lần đầu)Tự làm (có kinh nghiệm)Thuê chuyên gia
Setup cơ bản4–8 giờ1–2 giờ2–4 giờ
Bảo mật nâng cao2–4 giờ30 phút1–2 giờ
Tối ưu performance2–4 giờ30 phút1–2 giờ
Migration website2–8 giờ1–2 giờ1–3 giờ
Tổng10–24 giờ3–5 giờ5–11 giờ
Chi phí0 VND (nhưng tốn thời gian)0 VND2–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:

  1. OPcache đã bật chưa? (php -m | grep opcache)
  2. Redis đã hoạt động chưa? (redis-cli ping)
  3. Gzip compression đã bật chưa?
  4. Database có index đúng chưa?
  5. 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.

#Ubuntu#Nginx#VPS#cài đặt
Chia sẻ: Z

Sẵn sàng chuyển đổi số cùng Trinh Digital?

Liên hệ ngay để nhận tư vấn miễn phí. Đội ngũ chuyên gia sẽ phân tích nhu cầu và đề xuất giải pháp tối ưu.

Zalo