Website đã chạy bằng HTTP nhưng chưa có HTTPS thì dữ liệu truyền giữa trình duyệt và máy chủ chưa được mã hóa bằng TLS. Bạn có thể cài SSL miễn phí cho VPS bằng Certbot để yêu cầu chứng chỉ miễn phí từ Let’s Encrypt và tự động cập nhật cấu hình website. Bài viết này hướng dẫn kiểm tra điều kiện đầu vào, cấp chứng chỉ, chuyển hướng HTTP sang HTTPS và xác nhận khả năng gia hạn sau khi cài đặt.
Điều kiện trước khi cài SSL cho Nginx
Hướng dẫn dùng Ubuntu 22.04/24.04 LTS, Nginx cài trực tiếp trên máy chủ và tài khoản có quyền sudo. Các ví dụ dùng example.com và www.example.com; hãy thay bằng tên miền thực tế. Nếu Nginx chạy trong Docker hoặc do control panel quản lý, cách triển khai có thể khác. Bạn có thể tham khảo bài cài SSL miễn phí cho VPS để chọn phương pháp phù hợp.
Kiểm tra DNS và cổng 80/443
Bản ghi A phải trỏ về IPv4 công khai của VPS. Nếu có bản ghi AAAA, IPv6 đó cũng phải dẫn đúng đến máy chủ.
dig +short A example.com
dig +short AAAA example.com
dig +short A www.example.com
dig +short AAAA www.example.com
Đừng chỉ kiểm tra IPv4. Let’s Encrypt ưu tiên IPv6 khi tên miền có cả hai loại địa chỉ, nên một bản ghi AAAA trỏ về máy chủ cũ có thể làm xác thực thất bại dù IPv4 vẫn bình thường. Hãy sửa hoặc xóa bản ghi đó.
Tiếp theo, kiểm tra từ một máy khác ngoài VPS:
curl -I http://example.com
curl -I http://www.example.com

Website phải mở đúng nội dung. Nếu thấy trang mặc định của Nginx, hãy sửa cấu hình tên miền trước khi cấp chứng chỉ.
Bài dùng xác thực HTTP-01 qua cổng TCP 80, nên cổng này phải mở. Phương pháp này không cấp được chứng chỉ wildcard (*.example.com); trường hợp đó cần DNS-01. Nếu dùng UFW:
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Hãy kiểm tra cả firewall trong trang quản trị VPS hoặc cloud. Nếu định bật UFW, phải cho phép cổng SSH trước để khỏi mất quyền truy cập. Nếu dùng Cloudflare ở chế độ proxy, DNS công khai sẽ trả IP của Cloudflare, nên cần bảo đảm yêu cầu xác thực không bị CDN hoặc WAF chặn.
Kiểm tra Nginx và sao lưu cấu hình
nginx -v
sudo systemctl status nginx --no-pager
sudo nginx -t
server_name example.com www.example.com;
Dùng sudo nginx -T để xem toàn bộ cấu hình đang nạp, hữu ích khi máy chủ có nhiều website. Trước khi để Certbot chỉnh sửa, hãy sao lưu:
sudo cp -a /etc/nginx “/root/nginx-before-ssl-$(date +%Y%m%d-%H%M%S)”

Cách cài SSL Nginx bằng Let’s Encrypt và Certbot
Quy trình dùng Certbot qua Snap, cách được dự án Certbot khuyến nghị.
Bước 1: Cài Certbot và kiểm tra plugin Nginx
Kiểm tra máy đã có Certbot chưa:
command -v certbot
Nếu đã có, hãy xác định cách cài hiện tại, tránh cài chồng bản Snap lên bản APT. Nếu chưa có:
sudo apt update
sudo apt install snapd
sudo snap install --classic certbot
/snap/bin/certbot --version
sudo /snap/bin/certbot plugins
Kết quả phải có plugin nginx. Với bản Snap, bạn không cần cài thêm python3-certbot-nginx.

Bước 2: Cấp và cài chứng chỉ
Nếu dùng cả tên miền chính và www:
sudo /snap/bin/certbot --nginx \
-d example.com \
-d www.example.com \
--redirect

Nếu chỉ dùng tên miền chính, bỏ dòng -d www.example.com. Trong đó –nginx dùng plugin Nginx để xác thực và cài chứng chỉ, -d khai báo từng tên miền, còn –redirect yêu cầu chuyển hướng HTTP sang HTTPS.
Lần đầu chạy, hãy làm theo lời nhắc để nhập email và đồng ý điều khoản. Chỉ thêm www khi tên này đã có DNS và được Nginx phục vụ đúng, vì nếu một tên không xác thực được, cả yêu cầu có thể thất bại. Lưu ý https://www.example.com vẫn cần chứng chỉ hợp lệ cho www, kể cả khi bạn chuyển nó về tên miền không www.
Kiểm tra chứng chỉ đã lưu:
sudo /snap/bin/certbot certificates

Bước 3: Rà soát cấu hình HTTPS
Mở file cấu hình website và đối chiếu các chỉ thị Certbot vừa thêm:
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Đây chỉ là phần cần đối chiếu, đừng thay thế toàn bộ khối website và hãy giữ nguyên root, location, PHP-FPM hoặc proxy_pass. Dùng đúng đường dẫn từ certbot certificates, vì thư mục thực tế có thể có hậu tố như example.com-0001. Không nới quyền khóa riêng để xử lý lỗi truy cập file.
Nếu bạn có chỉnh tay, kiểm tra rồi mới nạp lại:
sudo nginx -t
sudo systemctl reload nginx

Kiểm tra website sau khi cài SSL
Mở website bằng HTTPS và xác nhận chứng chỉ đúng tên miền, còn hiệu lực, không có cảnh báo. Sau đó chạy:
curl -I https://example.com
curl -I http://example.com
curl -IL --max-redirs 10 http://example.com

Lệnh thứ hai phải trả về chuyển hướng (thường là 301) với Location dẫn đến URL HTTPS. Lệnh thứ ba phải kết thúc ở đúng website. Đừng dùng tùy chọn -k vì nó bỏ qua việc xác minh chứng chỉ.
Nếu dùng CDN, bạn có thể kiểm tra trực tiếp Nginx trên VPS bằng cách chỉ định IP gốc:
curl -I --resolve example.com:443:203.0.113.10 https://example.com
Thay 203.0.113.10 bằng IP VPS. Cuối cùng, hãy thử trang chủ, một trang nội dung, đăng nhập và các biểu mẫu để chắc chắn ảnh, CSS và JavaScript đều tải bình thường.
Các lỗi thường gặp khi cài SSL cho Nginx
Certbot xác thực thất bại
| Dấu hiệu | Nên kiểm tra |
| NXDOMAIN | Bản ghi DNS, tên miền gõ sai |
| Connection refused | Nginx có chạy và nghe cổng 80 không |
| Timeout | Firewall, định tuyến, khả năng truy cập từ Internet |
| Unauthorized | Sai máy chủ, sai khối website, CDN/WAF, chuyển hướng |
| Chỉ www lỗi | DNS và server_name của www |
| IPv4 ổn nhưng vẫn lỗi | Bản ghi AAAA và IPv6 |
Hãy kiểm tra từ bên ngoài VPS, vì truy cập được localhost chưa chứng minh Internet kết nối được. Nếu dùng CDN hoặc WAF, bảo đảm đường dẫn /.well-known/acme-challenge/ không bị chặn. Nếu không thể mở cổng 80, hãy chuyển sang DNS-01.
Nginx báo lỗi cấu hình hoặc phục vụ sai chứng chỉ
Chạy sudo nginx -t để xem file và dòng lỗi, thường là thiếu dấu ;, sai ngoặc hoặc đường dẫn chứng chỉ không tồn tại. Nếu website trả chứng chỉ của tên miền khác, hãy kiểm tra server_name trong khối cổng 443, đường dẫn ssl_certificate, cấu hình khai báo trùng và DNS có còn trỏ về máy chủ cũ không. Nếu thay đổi làm website lỗi, hãy khôi phục file từ bản sao trước khi cài SSL, rồi kiểm tra và nạp lại.
Không xóa thư mục /etc/letsencrypt/ để “cài lại từ đầu”, vì nơi này còn chứa chứng chỉ, khóa riêng và dữ liệu gia hạn của các website khác.
Lặp chuyển hướng hoặc còn tài nguyên HTTP
Vòng lặp thường xảy ra khi các lớp cấu hình yêu cầu trái ngược nhau, ví dụ Nginx ép HTTPS nhưng ứng dụng lại đưa về HTTP. Dùng curl -IL –max-redirs 10 http://example.com để quan sát và đối chiếu quy tắc ở Nginx, ứng dụng và CDN.
Với Cloudflare, chế độ Flexible kết nối về máy chủ gốc bằng HTTP và dễ tạo vòng lặp với Nginx. Khi VPS đã có chứng chỉ hợp lệ, hãy chuyển sang Full (strict).
Mixed content là trường hợp trang HTTPS vẫn gọi tài nguyên qua HTTP, thể hiện qua ảnh mất, thiếu CSS hoặc lỗi trong Console. Hãy sửa URL tại nguồn (giao diện, ứng dụng, nội dung hoặc cơ sở dữ liệu) và bảo đảm tài nguyên bên ngoài cũng hỗ trợ HTTPS.
Kiểm tra gia hạn tự động
Sau khi website ổn định, chạy thử gia hạn:
sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all

Lệnh đầu thử quy trình gia hạn trên môi trường staging mà không thay chứng chỉ đang chạy. Lệnh sau giúp tìm timer của Certbot; với bản Snap, tên thường là snap.certbot.renew.timer. Đừng tạo thêm cron chỉ vì không thấy tên certbot.timer.
Hai bước này xác nhận hai việc khác nhau: dry run thành công nghĩa là quy trình gia hạn hoạt động, còn timer có lịch nghĩa là hệ thống có tác vụ gọi gia hạn định kỳ. Sau khi đổi IP, chuyển máy chủ, sửa firewall hoặc thêm CDN, hãy kiểm tra lại. Nếu dry run lỗi, đọc log tại /var/log/letsencrypt/letsencrypt.log.
Kết luận
Cài SSL Nginx hoàn tất khi website phục vụ đúng chứng chỉ, HTTP chuyển sang HTTPS đúng đích, tài nguyên tải bình thường và cơ chế gia hạn đã được kiểm tra. Quy trình trong hướng dẫn của Thuê VPS Giá Rẻ giúp bạn xác nhận từng phần này và xác định nơi cần xử lý khi phát sinh lỗi.

Tôi là Trần Thành Hồng Quân, nhân viên kỹ thuật tại THUEVPSGIARE.COM. Với hơn 5 năm kinh nghiệm trong lĩnh vực VPS, Hosting và quản trị hệ thống, tôi đã trực tiếp triển khai, vận hành và xử lý nhiều vấn đề kỹ thuật liên quan đến máy chủ và hạ tầng hosting. Thông qua các bài viết kỹ thuật trên THUEVPSGIARE.COM, tôi mong muốn chia sẻ những kiến thức thực tế, dễ hiểu và có thể áp dụng, giúp người dùng sử dụng VPS, Hosting và Server hiệu quả, ổn định và an toàn hơn.


