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.
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
sudohoặ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:
- bắt đầu với VPS vừa nhu cầu;
- theo dõi CPU, RAM, disk và network;
- tối ưu cache và database;
- 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ự:
- Ubuntu Server;
- Nginx;
- PHP-FPM;
- MySQL;
- server block;
- SSL;
- tải source WordPress;
- tạo database/user;
- 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
- Ubuntu Server 26.04.1 LTS: https://ubuntu.com/download/server
- Ubuntu Server Docs – Nginx: https://ubuntu.com/server/docs/how-to/web-services/install-nginx/
- Ubuntu Server Docs – Configure Nginx: https://ubuntu.com/server/docs/how-to/web-services/configure-nginx/
- Ubuntu Server Docs – Firewall/UFW: https://ubuntu.com/server/docs/security-firewall/
- Ubuntu Server Docs – PHP: https://ubuntu.com/server/docs/programming-php/
- Certbot – Nginx instructions: https://certbot.eff.org/instructions
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 →