Hướng Dẫn Cài Website Trên VPS Ubuntu Từ A-Z 2026

Hướng dẫn cài website trên VPS Ubuntu từ A-Z với Nginx, PHP-FPM, MySQL, tên miền, UFW và SSL Let's Encrypt. Phù hợp người mới muốn tự triển khai website trên VPS Linux an toàn, dễ quản lý và sẵn sàng mở rộng.

Cài website trên VPS Ubuntu giúp bạn chủ động hơn so với shared hosting: tự chọn web server, phiên bản phần mềm, cấu hình bảo mật, dung lượng và cách mở rộng tài nguyên. Năm 2026, Ubuntu Server 26.04.1 LTS là bản LTS mới nhất; Ubuntu vẫn duy trì Nginx, PHP, MySQL và UFW trong hệ sinh thái tài liệu chính thức. Trong hướng dẫn này, chúng ta sẽ đi từ một VPS mới hoàn toàn đến website chạy HTTPS với tên miền riêng: cập nhật hệ thống, cài Nginx, tạo server block, trỏ DNS, cấu hình firewall, cài PHP-FPM và MySQL khi website động cần sử dụng, sau đó cấp SSL miễn phí bằng Let's Encrypt/Certbot. Các lệnh được trình bày theo hướng an toàn và dễ kiểm tra, đồng thời chỉ ra những lỗi phổ biến như 502 Bad Gateway, sai quyền thư mục, DNS chưa cập nhật hoặc firewall chặn cổng web.

Điểm quan trọng Hãy lựa chọn dịch vụ dựa trên nhu cầu sử dụng thực tế và theo dõi tài nguyên thường xuyên để có hiệu quả tốt nhất.

Tự cài website trên VPS Ubuntu là một kỹ năng rất hữu ích nếu bạn muốn chủ động về hiệu năng, bảo mật và cấu hình máy chủ. Khác với shared hosting, VPS cho phép bạn quản trị toàn bộ hệ điều hành: cài Nginx hoặc Apache, chọn PHP, triển khai database, cấu hình SSL, firewall, backup và tối ưu theo đúng workload của website.

Hướng dẫn này sử dụng Nginx + PHP-FPM + MySQL theo mô hình gần với LEMP. Nếu website của bạn chỉ là HTML/CSS/JavaScript tĩnh, bạn có thể dừng sau phần Nginx và SSL, không cần cài PHP hay MySQL.

Ubuntu hiện công bố Ubuntu Server 26.04.1 LTS là bản LTS mới nhất. LTS có chu kỳ cập nhật bảo mật và bảo trì dài, phù hợp cho máy chủ cần vận hành ổn định. Tuy vậy, các bước trong bài cũng có thể áp dụng cho nhiều bản Ubuntu Server LTS gần đây; tên package hoặc socket PHP có thể khác nhẹ theo phiên bản.

Mục tiêu sau khi hoàn thành: tên miền trỏ đúng về VPS, Nginx phục vụ website, UFW chỉ mở các cổng cần thiết, PHP/MySQL sẵn sàng cho website động và HTTPS hoạt động với chứng chỉ Let's Encrypt.

1. Chuẩn bị trước khi cài website trên VPS Ubuntu

Bạn cần:

  • Một VPS Ubuntu có IPv4 public hoặc IPv6 phù hợp.
  • Quyền sudo hoặc tài khoản quản trị.
  • Một tên miền nếu muốn chạy website thật.
  • Quyền chỉnh DNS của tên miền.
  • Source code website hoặc một file HTML để kiểm tra.
  • Phần mềm SSH như Terminal, Windows Terminal, PuTTY, Termius hoặc ứng dụng tương đương.

HUONG CLOUD hiện hỗ trợ cả Windows/Linux trên các gói VPS phù hợp, có IPv4 public và storage NVMe theo cấu hình công bố. Nếu bạn chưa có máy chủ, có thể tham khảo VPS tại HUONG CLOUD rồi chọn tài nguyên dựa trên lượng truy cập, ứng dụng và database thực tế.

Cấu hình VPS bao nhiêu là đủ?

Không có một cấu hình chính xác cho mọi website. Một landing page tĩnh nhẹ có nhu cầu rất khác WordPress nhiều plugin, website bán hàng hay API có database lớn.

Thay vì mua cấu hình quá cao ngay từ đầu, nên:

  1. bắt đầu với VPS vừa nhu cầu;
  2. theo dõi CPU, RAM, disk và network;
  3. tối ưu cache và database;
  4. nâng tài nguyên khi có dữ liệu cho thấy bottleneck.

2. Kết nối SSH vào VPS Ubuntu

Sau khi VPS được cấp, bạn thường nhận được IP, username và thông tin xác thực.

Kết nối bằng SSH:

ssh username@IP_VPS

Ví dụ:

ssh ubuntu@203.0.113.10

Nếu VPS dùng cổng SSH khác 22:

ssh -p 2222 ubuntu@203.0.113.10

Sau lần đăng nhập đầu tiên, nên đổi mật khẩu nếu nhà cung cấp cấp mật khẩu tạm và cân nhắc sử dụng SSH key thay cho mật khẩu.

3. Cập nhật Ubuntu trước khi cài web server

Chạy:

sudo apt update
sudo apt upgrade -y

Sau đó kiểm tra có cần reboot hay không:

if [ -f /var/run/reboot-required ]; then cat /var/run/reboot-required; fi

Nếu hệ thống yêu cầu reboot:

sudo reboot

Đợi VPS lên lại rồi SSH vào tiếp.

Việc cập nhật trước khi triển khai giúp giảm khả năng bạn xây website trên một hệ thống đang thiếu bản vá bảo mật.

4. Tạo user quản trị riêng thay vì làm mọi việc bằng root

Nếu VPS chỉ cung cấp tài khoản root, bạn có thể tạo user riêng:

adduser deploy
usermod -aG sudo deploy

Sau đó đăng nhập bằng user mới và chỉ dùng sudo khi cần quyền quản trị.

Ubuntu khuyến nghị nguyên tắc least privilege: tài khoản thông thường chỉ nên có quyền cần thiết, không vận hành mọi tác vụ bằng root.

5. Cài Nginx trên Ubuntu

Ubuntu cung cấp Nginx trực tiếp từ repository chính thức.

Cài đặt:

sudo apt update
sudo apt install nginx -y

Kiểm tra trạng thái:

sudo systemctl status nginx

Nếu dịch vụ hoạt động, bạn sẽ thấy trạng thái active (running).

Có thể kiểm tra nhanh từ trình duyệt bằng:

http://IP_VPS

Nếu trang mặc định của Nginx xuất hiện, web server đã chạy.

Các lệnh Nginx nên nhớ

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart nginx
sudo systemctl status nginx

Luôn chạy sudo nginx -t trước khi reload sau khi sửa cấu hình. Việc này giúp phát hiện syntax error trước khi áp dụng.

6. Cấu hình UFW cho website

Ubuntu dùng UFW làm công cụ firewall đơn giản ở lớp host.

Trước khi bật UFW, phải bảo đảm SSH được phép để tránh tự khóa khỏi VPS:

sudo ufw allow OpenSSH

Cho phép HTTP và HTTPS. Sau khi cài Nginx, bạn có thể xem profile:

sudo ufw app list

Nếu có Nginx Full:

sudo ufw allow 'Nginx Full'

Sau đó bật firewall:

sudo ufw enable
sudo ufw status verbose

Một website public thông thường cần:

  • SSH để quản trị;
  • TCP 80 cho HTTP;
  • TCP 443 cho HTTPS.

Không nên mở MySQL port 3306 ra Internet nếu database chỉ phục vụ ứng dụng chạy trên cùng VPS.

7. Trỏ tên miền về VPS Ubuntu

Tại trang quản lý DNS của tên miền, tạo bản ghi:

Với IPv4

Type: A
Name: @
Value: IP_VPS

Cho www, có thể dùng:

Type: CNAME
Name: www
Value: tenmiencuaban.com

Hoặc tạo bản ghi A riêng cho www trỏ cùng IPv4.

Với IPv6

Nếu VPS có IPv6 và bạn muốn website hoạt động dual-stack, thêm bản ghi AAAA trỏ về IPv6 của VPS.

DNS có thể cần thời gian cập nhật tùy TTL và resolver. Bạn có thể kiểm tra:

nslookup tenmiencuaban.com

hoặc:

dig tenmiencuaban.com

Chỉ nên cấp SSL sau khi tên miền thực sự resolve về đúng VPS.

8. Tạo thư mục website riêng

Ví dụ domain là example.com:

sudo mkdir -p /var/www/example.com/public
sudo chown -R $USER:$USER /var/www/example.com
sudo chmod -R 755 /var/www/example.com

Tạo file test:

nano /var/www/example.com/public/index.html

Nội dung mẫu:




  
  
  Website trên VPS Ubuntu


  Website đã chạy trên VPS Ubuntu


Nếu website của bạn là source code có sẵn, hãy upload source vào thư mục này thay vì dùng file test.

9. Tạo Nginx Server Block cho tên miền

Nginx trên Ubuntu sử dụng sites-available và sites-enabled để quản lý nhiều website.

Tạo file:

sudo nano /etc/nginx/sites-available/example.com

Cấu hình website tĩnh:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;
    root /var/www/example.com/public;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

Bật site:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Kiểm tra:

sudo nginx -t

Nếu không có lỗi:

sudo systemctl reload nginx

Truy cập:

http://example.com

Nếu website hiện đúng, phần Nginx cơ bản đã hoàn tất.

10. Cài PHP-FPM cho website PHP

Nếu website chỉ là static site, bỏ qua phần này.

Cài PHP-FPM và một số extension phổ biến:

sudo apt install php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-gd -y

Kiểm tra PHP:

php -v

Kiểm tra socket PHP-FPM thực tế:

ls -la /run/php/

Bạn có thể thấy socket dạng:

php8.x-fpm.sock

Phiên bản chính xác phụ thuộc Ubuntu và package đang cài, vì vậy không nên sao chép cứng một số phiên bản nếu chưa kiểm tra.

Cập nhật Nginx để chạy PHP

Sửa server block:

sudo nano /etc/nginx/sites-available/example.com

Ví dụ:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;
    root /var/www/example.com/public;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.x-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Quan trọng: thay php8.x-fpm.sock bằng socket thật bạn vừa thấy trong /run/php/.

Kiểm tra và reload:

sudo nginx -t
sudo systemctl reload nginx

11. Cài MySQL cho website động

Nếu website cần database:

sudo apt install mysql-server -y

Kiểm tra:

sudo systemctl status mysql

Trên hệ thống mới, chạy quy trình hardening phù hợp với phiên bản MySQL của bạn:

sudo mysql_secure_installation

Sau đó vào MySQL:

sudo mysql

Tạo database và user riêng cho website:

CREATE DATABASE website_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'website_user'@'localhost' IDENTIFIED BY 'MAT_KHAU_RAT_MANH';
GRANT ALL PRIVILEGES ON website_db.* TO 'website_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Không nên để ứng dụng website dùng tài khoản root MySQL.

12. Cài SSL miễn phí Let's Encrypt bằng Certbot

Trước khi cấp SSL, cần bảo đảm:

  • domain resolve đúng IP VPS;
  • Nginx đang chạy;
  • port 80 và 443 được firewall cho phép;
  • website truy cập được qua HTTP.

Certbot hiện khuyến nghị phương pháp cài qua Snap cho Nginx trên Linux.

Cài Certbot:

sudo snap install --classic certbot

Tạo symlink:

sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

Nếu đường dẫn đã tồn tại, không cần tạo lại.

Cấp chứng chỉ và để Certbot chỉnh Nginx:

sudo certbot --nginx

Chọn domain cần cấp SSL và làm theo hướng dẫn trên màn hình.

Sau khi hoàn thành, kiểm tra:

https://example.com

Kiểm tra tự động gia hạn SSL

sudo certbot renew --dry-run

Certbot thiết lập cơ chế tự gia hạn; lệnh dry-run giúp kiểm tra quy trình trước khi chứng chỉ gần hết hạn.

13. Thiết lập quyền file an toàn hơn

Một lỗi phổ biến là đặt chmod 777 toàn bộ website chỉ để xử lý lỗi permission. Đây là cách không an toàn.

Nguyên tắc nên áp dụng:

  • file chỉ cần quyền đọc/ghi theo user triển khai;
  • web server chỉ cần quyền đọc trừ thư mục upload/cache thật sự cần ghi;
  • không chạy ứng dụng web bằng root;
  • tách user database riêng;
  • tránh lưu mật khẩu trong source code public repository.

Nếu framework hoặc CMS cần ghi vào thư mục cụ thể như storage, cache hoặc uploads, chỉ cấp quyền cần thiết cho đúng thư mục đó.

14. Tăng bảo mật SSH cho VPS Ubuntu

Dùng SSH key

Trên máy cá nhân:

ssh-keygen -t ed25519

Copy key:

ssh-copy-id deploy@IP_VPS

Sau khi xác nhận đăng nhập bằng key hoạt động, bạn có thể cân nhắc tắt password login trong SSH theo chính sách bảo mật của mình.

Không đăng nhập root trực tiếp nếu không cần

Sử dụng user thường + sudo giúp giảm rủi ro thao tác nhầm và phù hợp nguyên tắc least privilege.

Giữ hệ thống cập nhật

Có thể kiểm tra các bản cập nhật định kỳ:

sudo apt update
apt list --upgradable

Ubuntu cũng hỗ trợ unattended-upgrades cho các bản vá phù hợp, nhưng nên hiểu rõ maintenance window trước khi bật automation trên production server.

15. Tối ưu Nginx và PHP theo workload, không dùng “config thần thánh”

Không nên sao chép một file nginx.conf tối ưu từ Internet rồi áp dụng cho mọi VPS.

Các yếu tố cần theo dõi gồm:

  • CPU usage;
  • RAM usage;
  • PHP-FPM process count;
  • MySQL memory;
  • request rate;
  • response time;
  • disk I/O;
  • network throughput.

Tối ưu tốt là thay đổi từng phần và đo lại.

Static cache

Với file CSS/JS/image có versioning, bạn có thể thêm cache header phù hợp.

Gzip

Nginx hỗ trợ gzip cho nội dung text; có thể giảm bandwidth cho HTML/CSS/JS nhưng cần cấu hình đúng loại MIME.

PHP OPcache

Với website PHP, OPcache có thể giảm việc biên dịch lại PHP script ở mỗi request. Kiểm tra package và cấu hình tương ứng với phiên bản PHP đang dùng.

16. Cài WordPress trên VPS Ubuntu có khác không?

Kiến trúc nền vẫn tương tự:

  1. Ubuntu Server;
  2. Nginx;
  3. PHP-FPM;
  4. MySQL;
  5. server block;
  6. SSL;
  7. tải source WordPress;
  8. tạo database/user;
  9. chạy trình cài đặt WordPress.

WordPress thường cần thêm các PHP extension tùy plugin/theme. Không nên cài toàn bộ extension không cần thiết; hãy dựa vào yêu cầu thực tế của ứng dụng.

17. Backup website trước khi tối ưu hoặc cập nhật lớn

Một website production nên có ít nhất hai nhóm dữ liệu cần backup:

  • source code và file upload;
  • database.

Ví dụ backup MySQL:

mysqldump -u website_user -p website_db > website_db.sql

Backup thư mục web:

tar -czf website-files.tar.gz /var/www/example.com

Tuy nhiên, chỉ giữ backup trên cùng VPS không phải chiến lược tốt nhất. Nếu VPS hỏng storage hoặc bị xâm nhập, backup cùng máy có thể mất theo. Nên có bản sao ở vị trí độc lập hoặc sử dụng snapshot/backup của nhà cung cấp nếu phù hợp.

18. Các lỗi thường gặp khi cài website trên VPS Ubuntu

Website không truy cập được bằng domain

Kiểm tra:

nslookup example.com
sudo ufw status
sudo systemctl status nginx

Nếu domain chưa resolve đúng IP, sửa DNS trước.

Nginx báo 403 Forbidden

Thường liên quan quyền thư mục hoặc thiếu file index.

Kiểm tra:

ls -la /var/www/example.com/public

Nginx báo 502 Bad Gateway

Thường xảy ra khi PHP-FPM không chạy hoặc socket trong Nginx không đúng.

Kiểm tra:

ls -la /run/php/
systemctl list-units --type=service | grep php

Sau đó sửa fastcgi_pass đúng socket thực tế.

nginx -t báo syntax error

Không reload Nginx cho đến khi sửa xong:

sudo nginx -t

Lệnh sẽ cho biết file và dòng cấu hình có vấn đề.

SSL Certbot thất bại

Kiểm tra:

  • domain đã trỏ đúng IP chưa;
  • port 80 có mở không;
  • Nginx có phục vụ domain không;
  • DNS proxy/CDN có ảnh hưởng challenge không.

19. Checklist sau khi website lên online

Sau khi cài xong, hãy kiểm tra:

  • Domain trỏ đúng VPS.
  • HTTP tự chuyển sang HTTPS nếu đã cấu hình redirect.
  • Chứng chỉ SSL hợp lệ.
  • UFW đang bật.
  • SSH vẫn truy cập được.
  • Nginx config pass nginx -t.
  • Database không mở public nếu không cần.
  • Backup đã được thiết lập.
  • Log không có lỗi lặp lại bất thường.
  • CPU/RAM còn đủ dư địa.
  • Website hoạt động tốt trên mobile và desktop.

20. FAQ về cài website trên VPS Ubuntu

Cài website trên VPS Ubuntu có khó không?

Nếu bạn biết SSH và làm từng bước, việc triển khai website cơ bản với Nginx khá rõ ràng. Phần cần cẩn thận nhất là DNS, quyền file, firewall, database và SSL.

Ubuntu VPS nên dùng Nginx hay Apache?

Cả hai đều phổ biến và được Ubuntu hỗ trợ. Nginx mạnh ở static content và reverse proxy; Apache có hệ sinh thái module lâu đời. Bài này dùng Nginx để có quy trình gọn và phù hợp nhiều website hiện đại.

Website tĩnh có cần PHP và MySQL không?

Không. HTML/CSS/JavaScript tĩnh chỉ cần web server như Nginx.

Có cần mua SSL không?

Không bắt buộc. Let's Encrypt cung cấp chứng chỉ TLS miễn phí và Certbot có thể tự cấu hình Nginx trong nhiều trường hợp.

Có nên mở port MySQL 3306 ra Internet?

Không nếu ứng dụng và MySQL chạy trên cùng VPS. Chỉ mở khi có nhu cầu thật và phải giới hạn nguồn truy cập, firewall và authentication phù hợp.

VPS bao nhiêu RAM thì chạy WordPress được?

Không có một con số đúng cho mọi site. RAM cần thiết phụ thuộc traffic, theme, plugin, PHP workers, cache và database. Nên theo dõi workload thật và nâng tài nguyên khi cần.

Có thể chạy nhiều website trên một VPS Ubuntu không?

Có. Nginx hỗ trợ nhiều server block, mỗi domain có thể có thư mục và cấu hình riêng. Tuy nhiên tổng CPU, RAM, storage và bandwidth phải đủ cho tất cả website.

Kết luận

Cài website trên VPS Ubuntu không chỉ là cài Nginx rồi upload source. Một hệ thống production tốt cần DNS đúng, firewall hợp lý, user quản trị an toàn, PHP/MySQL được cấu hình theo nhu cầu, HTTPS hoạt động và có backup để phục hồi khi xảy ra sự cố.

Với người mới, cách tốt nhất là triển khai từng lớp: Ubuntu → Nginx → domain → SSL → PHP → database → backup → monitoring. Đừng tối ưu quá sớm và đừng mở các cổng không cần thiết.

Nếu bạn đang cần một VPS Linux/Ubuntu để chạy website, API hoặc ứng dụng 24/7, có thể tham khảo các gói VPS tại HUONG CLOUD. Hãy chọn cấu hình dựa trên lưu lượng và workload thực tế, sau đó nâng CPU/RAM khi có dữ liệu cho thấy website cần thêm tài nguyên.

Nguồn tham khảo

Kết luận

Nếu chưa chắc cấu hình hoặc loại dịch vụ nào phù hợp, hãy gửi nhu cầu thực tế để đội ngũ hỗ trợ tư vấn trước khi mua.

Chưa biết nên chọn gói nào?

Xem bảng giá VPS hoặc liên hệ đội ngũ hỗ trợ để chọn cấu hình phù hợp.

Xem bảng giá VPS →