Có bao giờ bạn thấy bực mình khi đẩy code lên shared hosting cứ ì ạch, giới hạn đủ thứ chưa? Mình đã từng như vậy trong những năm đầu làm nghề. Cho đến khi khám phá ra “thế giới tự do” của máy chủ ảo, mọi thứ đã thay đổi hoàn toàn. Việc deploy website lên VPS bằng SSH giúp bạn nắm toàn quyền sinh sát server trong tay, tối ưu hiệu suất đến từng megabyte RAM, cảm giác nó “đã” lắm. Bài viết này là tất cả kinh nghiệm thực chiến mà Phạm Hải đúc kết được để bạn tự tay đưa dự án lên mạng nhanh gọn, chuyên nghiệp, không cần phải là siêu nhân hệ thống.
Tại Sao Dân Chuyên Nghiệp Chọn Deploy Lên VPS Bằng SSH & Cần Chuẩn Bị Gì?
Deploy qua SSH mang lại quyền kiểm soát tối đa, hiệu suất cao và khả năng tùy biến vô hạn so với hosting thông thường. Bạn chỉ cần chuẩn bị một VPS, domain và kiến thức dòng lệnh cơ bản để bắt đầu.
Quên shared hosting đi, đây là lý do VPS là chân ái
VPS cung cấp tài nguyên độc lập, cho phép bạn can thiệp sâu vào hệ thống bằng quyền root user thay vì bị gò bó trong các bảng điều khiển dựng sẵn.
Dùng shared hosting giống như ở trọ ghép, bạn không được tự ý sửa nhà hay cài thêm phần mềm lạ. Còn VPS (Virtual Private Server) là căn nhà riêng của bạn. Bạn có thể thoải mái cài đặt bất kỳ web server nào như Nginx hay Apache tùy thích để tối ưu cho loại code mình đang viết. Thao tác trực tiếp qua Terminal bằng các lệnh Linux giúp quá trình xử lý, nén file, di chuyển dữ liệu nhanh hơn gấp nhiều lần so với việc click chuột chờ đợi trên giao diện cPanel chậm chạp. Hơn nữa, tài nguyên RAM và CPU của bạn là độc lập, không sợ bị website của “hàng xóm” làm ảnh hưởng đến tốc độ tải trang.
Checklist đồ nghề cần thiết trước khi xuất phát
Trước khi bắt tay vào việc, bạn cần đảm bảo đã thuê sẵn một VPS, có tên miền đã trỏ IP và thiết lập các công cụ kết nối bảo mật.
Đừng vội gõ lệnh khi chưa chuẩn bị đủ “đạn dược”. Thiếu sót ở bước này sẽ khiến bạn loay hoay rất mất thời gian. Dưới đây là những thứ bắt buộc phải có trên bàn làm việc của bạn:
| Công cụ/Tài nguyên | Yêu cầu chi tiết |
|---|---|
| VPS & Hệ điều hành | Khuyên dùng Ubuntu 20.04/22.04, CentOS hoặc Debian. RAM tối thiểu 1GB. |
| Domain & IP | Một domain (tên miền) đã cấu hình DNS trỏ Record A về IP address của VPS. |
| Bảo mật kết nối | Cặp public key và private key để đăng nhập qua SSH key an toàn. |
Tại Phạm Hải, mình luôn khuyên anh em nên tạo SSH key ngay từ đầu để đăng nhập thay vì dùng mật khẩu gốc. Việc này giúp ngăn chặn triệt để các cuộc tấn công brute-force từ hacker đang nhắm vào cổng 22 của server.
Quy Trình 5 Bước Deploy Website Lên VPS Ubuntu ‘Chuẩn Sách Giáo Khoa’
Quy trình chuẩn bao gồm 5 bước: kết nối server, cài đặt môi trường, kéo code về qua Git, cấu hình web server và bảo mật bằng chứng chỉ SSL. Dưới đây là hướng dẫn deploy website lên VPS Ubuntu bằng SSH chi tiết nhất.
Bước 1: Kết Nối SSH & “Dọn Nhà” Cho Server Mới
Bước đầu tiên là đăng nhập vào VPS, cập nhật các gói phần mềm hệ thống và thiết lập tường lửa cơ bản để bảo vệ máy chủ khỏi các truy cập trái phép.
Cách deploy website lên VPS cho người mới luôn bắt đầu từ việc làm quen với màn hình đen chữ trắng. Mở Terminal (hoặc PuTTY nếu dùng Windows) lên và gõ lệnh: ssh root@dia_chi_ip_cua_ban. Lần đầu kết nối, hệ thống sẽ hỏi bạn có tin tưởng IP này không, hãy gõ “yes”.
Sau khi vào được bên trong bằng quyền root user (hoặc user có quyền sudo), việc đầu tiên là chạy lệnh update thông qua package manager (như apt trên Ubuntu hoặc yum, dnf trên CentOS). Bạn gõ lệnh sau để cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y
Kế tiếp, đừng quên bật Firewall (tường lửa). Với hệ điều hành Ubuntu, việc cấu hình UFW rất đơn giản. Bạn chỉ cần mở các cổng cần thiết: sudo ufw allow OpenSSH, sudo ufw allow 'Nginx Full', rồi kích hoạt bằng sudo ufw enable. Nếu bạn còn bỡ ngỡ với các lệnh này và muốn xây dựng nền tảng vững chắc, việc đọc thêm tài liệu Quản trị Linux server cơ bản cho developer là bước khởi đầu rất cần thiết.
Bước 2: Cài Đặt “Bộ Tam Quyền Lực” – Web Server, Database & Ngôn Ngữ
Tùy thuộc vào mã nguồn, bạn sẽ cần cài đặt Nginx hoặc Apache, hệ quản trị cơ sở dữ liệu (MySQL/MariaDB) và môi trường chạy code (PHP, Node.js).
Server mới mua về trống trơn thì không thể chạy web được. Mình thường ưu tiên dùng Nginx vì nó xử lý các request đồng thời cực kỳ trâu bò và tốn ít RAM. Lệnh cài đặt rất ngắn gọn: sudo apt install nginx -y.
Tiếp theo là thiết lập Database. Bạn có thể chọn MySQL hoặc MariaDB. Sau khi cài đặt xong qua lệnh sudo apt install mysql-server, hãy nhớ chạy lệnh mysql_secure_installation. Bước này giúp bạn xóa các user rác, database test và đặt mật khẩu root thật khó đoán để bảo mật dữ liệu.
Cuối cùng, cài môi trường ngôn ngữ lập trình. Nếu dự án chạy PHP, bạn cài php-fpm và các extension liên quan. Nếu bạn chạy ứng dụng Javascript, hãy cài đặt Node.js thông qua NVM (Node Version Manager) để dễ dàng chuyển đổi các phiên bản khi cần thiết.
Bước 3: Đẩy Code Lên VPS – Dùng Git Cho Chuyên Nghiệp!
Sử dụng Git để clone code từ kho lưu trữ (Github/Gitlab) xuống thư mục web của VPS là phương pháp an toàn, nhanh chóng và dễ quản lý phiên bản nhất.
Quên việc nén file zip rồi hì hục đẩy qua FTP đi, thời đại này chúng ta xài Git. Trên VPS, bạn dùng lệnh mkdir để tạo thư mục chứa code, ví dụ: sudo mkdir -p /var/www/mywebsite. Sau đó dùng lệnh cd để di chuyển vào thư mục vừa tạo: cd /var/www/mywebsite.
Tiếp theo, hãy liên kết server với Github của bạn. Chạy lệnh git clone [link_repo_cua_ban] . (nhớ có dấu chấm ở cuối để code bung thẳng ra thư mục hiện tại). Việc dùng Git mang lại lợi ích khổng lồ: sau này mỗi lần fix bug hay có tính năng mới, bạn chỉ cần SSH vào và gõ git pull là code mới tự động được cập nhật. Cực kỳ nhàn và không sợ copy đè nhầm file!
Bước 4: Cấu Hình Nginx “Chỉ Đường Dẫn Lối” Cho Domain
Tạo file virtual host trong Nginx để báo cho máy chủ biết khi người dùng gõ tên miền vào trình duyệt thì cần hiển thị nội dung từ thư mục code nào.
Đây là bước cấu hình Nginx khi deploy website lên VPS mang tính quyết định. Bạn cần tạo một file cấu hình mới trong thư mục /etc/nginx/sites-available/. Dùng trình soạn thảo nano: sudo nano /etc/nginx/sites-available/mywebsite.
Trong file này, bạn khai báo chỉ thị server_name chính là domain của bạn (ví dụ: phamhai.com), và root chỉ đường dẫn tuyệt đối tới thư mục code /var/www/mywebsite. Nếu bạn chạy app Node.js, bạn sẽ không dùng root mà cấu hình Nginx làm reverse proxy để đẩy traffic từ port 80 về cổng nội bộ (ví dụ 3000).
Sau khi lưu file, tạo symlink sang thư mục sites-enabled. Luôn nhớ kiểm tra lỗi cú pháp bằng lệnh sudo nginx -t. Nếu màn hình báo “syntax is ok”, bạn khởi động lại dịch vụ bằng lệnh systemctl: sudo systemctl restart nginx.
Bước 5: Cài Đặt SSL Miễn Phí Với Let’s Encrypt – Web Phải HTTPS!
Bảo mật website bằng chứng chỉ SSL là tiêu chuẩn bắt buộc hiện nay. Công cụ Certbot và Let’s Encrypt giúp bạn tự động hóa hoàn toàn quá trình cấp phát này miễn phí.
Việc cài đặt SSL cho website trên VPS bằng SSH giờ đây dễ như ăn kẹo. Trình duyệt Google Chrome bây giờ thấy web HTTP là hiện cảnh báo “Không an toàn” to đùng ngay, khách hàng nhìn thấy sẽ bỏ chạy hết.
Bạn chỉ cần cài đặt Certbot – một công cụ tự động hóa tuyệt vời: sudo apt install certbot python3-certbot-nginx. Sau đó chạy lệnh sudo certbot --nginx -d domaincuaban.com -d www.domaincuaban.com. Certbot sẽ tự động xác minh tên miền, sinh chứng chỉ SSL, tự động sửa file cấu hình Nginx để ép luồng chạy qua HTTPS và thiết lập cronjob tự động gia hạn mỗi 90 ngày. Để hiểu sâu hơn về cơ chế mã hóa này, việc tìm hiểu SSL HTTPS là gì cách cài cho website sẽ cung cấp cho bạn cái nhìn tổng quan nhất.
Kinh Nghiệm Thực Chiến: Deploy Các Loại Website Phổ Biến

Mỗi framework hoặc CMS sẽ có những “trick” riêng khi đưa lên môi trường production để đảm bảo tính ổn định, tốc độ load và bảo mật dữ liệu.
Deploy website Laravel: Chú ý file .env và quyền thư mục
Khi deploy framework Laravel, bạn cần cài đặt các package qua Composer, thiết lập đúng file môi trường (.env) và cấp quyền ghi cho thư mục storage/cache.
Để deploy Laravel lên VPS bằng SSH trơn tru, sau khi clone code về, việc đầu tiên là chạy lệnh composer install --optimize-autoloader --no-dev để cài đặt thư viện. Tiếp đó, copy file .env.example thành .env, tạo app key mới và điền thông tin database chính xác vào đó.
Lỗi kinh điển nhất của anh em làm Laravel là gặp màn hình trắng hoặc lỗi 500 do sai phân quyền. Bạn bắt buộc phải dùng lệnh chown để cấp quyền sở hữu thư mục cho Nginx: sudo chown -R www-data:www-data /var/www/laravel. Sau đó dùng lệnh chmod cấp quyền ghi cho các thư mục sinh file động: sudo chmod -R 775 storage bootstrap/cache. Nếu bạn hay bị rối ở các con số phân quyền này, bài viết Linux file permission chmod chown giải thích sẽ giúp bạn gỡ rối triệt để.
Deploy website WordPress: Cấu hình wp-config.php và database
Quá trình đưa WordPress lên server tập trung vào việc import cơ sở dữ liệu từ localhost và tinh chỉnh file wp-config.php để kết nối thành công.
Việc deploy WordPress lên VPS bằng SSH đòi hỏi sự cẩn thận ở khâu dữ liệu. Bạn phải export database từ máy local thành file .sql, đẩy lên server và import vào MySQL qua lệnh: mysql -u root -p database_name < file_data.sql.
Tiếp theo, mở file wp-config.php và sửa thông tin DB_NAME, DB_USER, DB_PASSWORD cho khớp với database mới tạo trên VPS. Một mẹo nhỏ từ kinh nghiệm của mình là bạn nên tăng giới hạn upload file của PHP (upload_max_filesize và post_max_size trong file php.ini) để không bị văng lỗi khi tải các theme hoặc plugin nặng. Với những ai muốn một lộ trình hoàn chỉnh, hướng dẫn Cấu hình VPS Ubuntu chạy WordPress từ đầu là tài liệu bạn không nên bỏ qua.
Deploy website Node.js/Next.js: Đừng quên PM2!
Các ứng dụng chạy bằng Javascript cần một trình quản lý tiến trình như PM2 để giữ cho ứng dụng luôn chạy ngầm và tự động khởi động lại khi server crash.
Để deploy website Node.js lên VPS bằng SSH (tương tự với các framework như Next.js), sau khi kéo code, bạn dùng npm hoặc yarn để cài dependencies: npm install. Nếu là dự án Next.js, bạn cần chạy thêm lệnh build: npm run build.
Sai lầm của người mới là gõ lệnh npm start thẳng trên Terminal. Khi bạn tắt cửa sổ Terminal đó đi, website sẽ sập ngay lập tức. Giải pháp chuyên nghiệp là dùng PM2. Cài đặt nó bằng lệnh npm install -g pm2, sau đó khởi chạy app: pm2 start npm --name "my-app" -- start. Cuối cùng, gõ pm2 save và pm2 startup. Ứng dụng của bạn giờ đây sẽ sống dai như đỉa, tự động bật lại kể cả khi VPS bị khởi động lại.
Deploy website tĩnh (HTML/CSS/JS): Rsync là đủ!
Với các trang web tĩnh (landing page, portfolio) không có backend, việc đồng bộ file từ máy tính cá nhân lên VPS bằng lệnh rsync là phương án nhanh và an toàn nhất.
Các bước deploy website tĩnh lên VPS bằng SSH siêu đơn giản, bạn không cần cài đặt Git hay chạy lệnh build lằng nhằng trên server làm tốn tài nguyên.
Bạn chỉ cần build web ở máy tính local. Sau đó mở Terminal nội bộ lên và dùng lệnh rsync: rsync -avz ./dist/ root@ip_vps:/var/www/html/. Lệnh này sẽ nén dữ liệu và đồng bộ chính xác thư mục code tĩnh của bạn thẳng lên thư mục web mặc định của Nginx trên VPS. Tốc độ cực nhanh và chỉ cập nhật những file có sự thay đổi!
Nâng Cao Tay Nghề: Tự Động Hóa & Xử Lý Lỗi Thường Gặp

Tự động hóa quy trình CI/CD và nắm vững cách đọc log lỗi sẽ giúp bạn quản lý server nhàn hạ, tiết kiệm thời gian và xử lý sự cố chuyên nghiệp hơn.
Deploy tự động với Github Actions (CI/CD) – Set & Forget!
Thiết lập CI/CD giúp code tự động được build và đẩy lên server mỗi khi bạn push commit mới lên nhánh chính, loại bỏ hoàn toàn các thao tác thủ công.
Cứ mỗi lần sửa một dòng code CSS lại phải SSH vào VPS gõ git pull thì quả thật rất tù túng. Tại Phạm Hải, tụi mình luôn thiết lập quy trình deploy website tự động lên VPS cho mọi dự án của khách hàng.
Bằng cách sử dụng Github Actions (một dạng CI/CD pipeline), bạn chỉ cần viết một file .yml cấu hình. Mỗi khi có code mới được push lên nhánh main, Github sẽ tự động kích hoạt một container nhỏ (thường dùng chung với Docker), kết nối vào VPS của bạn qua SSH key, kéo code mới, tự động chạy npm install và restart lại PM2. Bạn chỉ việc gõ git push, sau đó nhâm nhi ly cafe chờ web tự động cập nhật. Cảm giác đó thực sự rất “pro”!
Bắt bệnh & chữa lỗi: 502 Bad Gateway, Permission Denied và những người bạn
Kiểm tra file log của Nginx và ứng dụng là chìa khóa vàng để chẩn đoán và giải quyết nhanh chóng các lỗi phổ biến khi đưa web lên môi trường thực tế.
Kỹ năng khắc phục lỗi khi deploy website lên VPS bằng SSH là thứ phân biệt giữa thợ học việc và thợ lành nghề. Thấy màn hình báo lỗi 502 Bad Gateway? Đừng hoảng. Lỗi này thường là do Nginx (đóng vai trò proxy) không kết nối được với app Node.js hoặc PHP-FPM phía sau. Hãy kiểm tra xem app của bạn đã chạy đúng port chưa, PM2 có đang báo lỗi crash lặp lại không.
Nếu gặp lỗi 403 Forbidden? 99% nguyên nhân là do sai phân quyền thư mục (chưa cấp quyền đọc cho user www-data). Lệnh cứu mạng của bạn trong mọi tình huống luôn là xem log: sudo tail -f /var/log/nginx/error.log. Việc kiên nhẫn đọc từng dòng log sẽ chỉ điểm chính xác server đang “đau” ở file nào, dòng số mấy để bạn bốc thuốc chữa bệnh kịp thời.
Deploy qua SSH lên VPS nghe thì có vẻ “nguy hiểm” và khô khan với toàn mã lệnh, nhưng thực ra nó là một quy trình rất logic và tuần tự. Nắm vững hướng dẫn deploy website lên VPS bằng SSH này không chỉ giúp bạn giải phóng dự án khỏi sự chật chội của shared hosting, toàn quyền kiểm soát hệ thống, mà còn mở ra một cánh cửa mới để nâng trình developer của bạn lên một tầm cao mới. Ban đầu có thể hơi vất vả khi làm quen với Terminal, nhưng cảm giác tự tay quản lý, tối ưu “đứa con tinh thần” của mình chạy mượt mà trên một server riêng thực sự rất đáng giá.
Bạn đang vướng mắc ở bước cấu hình Nginx, hay gặp khó khi tạo SSH key? Hay bạn có “tuyệt chiêu” tối ưu nào hay ho hơn muốn chia sẻ? Hãy để lại bình luận bên dưới nhé, mình và cộng đồng sẽ cùng nhau thảo luận và gỡ rối giúp bạn!
Lưu ý: Các thông tin trong bài viết này chỉ mang tính chất tham khảo. Để có lời khuyên tốt nhất, vui lòng liên hệ trực tiếp với chúng tôi để được tư vấn cụ thể dựa trên nhu cầu thực tế của bạn.