Giới thiệu
Trong thế giới phát triển web hiện đại, việc quản lý nhiều website trên một máy chủ không còn là điều xa lạ. Dù bạn là một developer cần môi trường staging, hay một freelancer quản lý các dự án của khách hàng, hay một doanh nghiệp nhỏ cần hosting nhiều dịch vụ, nhu cầu này đều rất phổ biến. Đi kèm với đó là yêu cầu về hiệu năng ổn định và bảo mật mạnh mẽ. HTTPS ngày nay không còn là một tùy chọn mà là một tiêu chuẩn bắt buộc.
Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package. Vì vậy, khi cần triển khai một môi trường web server đơn giản nhưng hiệu quả, Fedora luôn là lựa chọn đầu tiên của mình. Bài viết này sẽ chia sẻ chi tiết cách mình đã cấu hình Nginx làm web server và tích hợp Let’s Encrypt để cung cấp chứng chỉ SSL/TLS miễn phí trên Fedora, giúp bạn host nhiều website một cách an toàn và tối ưu.
So sánh các tiếp cận Web Server phổ biến
Khi nói đến web server, có vài cái tên luôn xuất hiện: Apache, Nginx và gần đây là Caddy. Mỗi công cụ có những triết lý thiết kế và ưu điểm riêng, phù hợp với từng nhu cầu sử dụng:
- Apache HTTP Server + Certbot: Đây là sự kết hợp kinh điển. Apache là một trong những web server lâu đời và phổ biến nhất, với hệ sinh thái module khổng lồ. Việc tích hợp chứng chỉ SSL từ Let’s Encrypt thông qua Certbot cũng rất đơn giản.
- Nginx + Certbot: Nginx ra đời sau nhưng nhanh chóng chiếm được thị phần nhờ vào kiến trúc hiệu năng cao, đặc biệt xuất sắc trong việc phục vụ các file tĩnh, cân bằng tải (load balancing) và làm reverse proxy. Việc kết hợp Nginx với Certbot để có HTTPS cũng đã trở thành một quy trình chuẩn.
- Caddy Server: Caddy là một web server tương đối mới nhưng rất mạnh mẽ, được thiết kế với ưu tiên hàng đầu là sự đơn giản và bảo mật. Điểm nổi bật nhất của Caddy là khả năng tự động cấp phát và gia hạn chứng chỉ SSL/TLS từ Let’s Encrypt hoặc ZeroSSL ngay khi bạn cấu hình domain, mà không cần bất kỳ bước thiết lập Certbot riêng biệt nào.
Phân tích ưu nhược điểm
-
Apache HTTP Server
- Ưu điểm: Rất ổn định, có cộng đồng hỗ trợ lớn, nhiều tài liệu, module phong phú, cấu hình linh hoạt thông qua file
.htaccess. - Nhược điểm: Có thể tiêu tốn nhiều tài nguyên hơn Nginx, đặc biệt khi xử lý các kết nối đồng thời số lượng lớn. Kiến trúc dựa trên tiến trình (process-based) có thể không tối ưu bằng kiến trúc hướng sự kiện (event-driven) của Nginx.
- Ưu điểm: Rất ổn định, có cộng đồng hỗ trợ lớn, nhiều tài liệu, module phong phú, cấu hình linh hoạt thông qua file
-
Nginx
- Ưu điểm: Hiệu năng cao, nhẹ, rất hiệu quả trong việc phục vụ file tĩnh và làm reverse proxy. Sử dụng ít tài nguyên hệ thống hơn Apache. Kiến trúc hướng sự kiện giúp xử lý lượng lớn kết nối đồng thời tốt hơn.
- Nhược điểm: Cấu hình có thể phức tạp hơn một chút so với Apache đối với người mới, đặc biệt là khi xử lý các ứng dụng web động (mặc dù Nginx thường được dùng kèm với PHP-FPM, Gunicorn, uWSGI…).
-
Caddy Server
- Ưu điểm: Cấu hình cực kỳ đơn giản, tự động HTTPS, dễ sử dụng cho các dự án nhỏ hoặc khi bạn muốn tiết kiệm thời gian tối đa.
- Nhược điểm: Cộng đồng và hệ sinh thái module chưa lớn bằng Apache hay Nginx. Có thể thiếu một số tính năng nâng cao hoặc linh hoạt cần thiết cho các môi trường enterprise phức tạp.
Lựa chọn phù hợp: Nginx trên Fedora
Sau khi cân nhắc, mình thấy Nginx trên Fedora là sự kết hợp tối ưu cho nhu cầu host nhiều website vừa và nhỏ, cần hiệu năng tốt và bảo mật cao mà không quá phức tạp.
Fedora, với tốc độ cập nhật package nhanh chóng, đảm bảo mình luôn có các phiên bản Nginx và Certbot mới nhất, tận dụng được các cải tiến về hiệu năng và bảo mật. Nginx đủ mạnh mẽ để đáp ứng các website có lưu lượng truy cập tương đối, và việc cấu hình tuy ban đầu hơi khác Apache nhưng một khi đã quen thì lại rất mạch lạc và gọn gàng.
Hướng dẫn triển khai chi tiết
1. Chuẩn bị hệ thống Fedora
Đầu tiên, đảm bảo hệ thống Fedora của bạn đã được cập nhật và các công cụ cần thiết đã được cài đặt.
Cập nhật hệ thống:
sudo dnf update -y
sudo dnf upgrade -y
Cài đặt Nginx:
sudo dnf install nginx -y
Bật và khởi động Nginx:
sudo systemctl enable --now nginx
Để kiểm tra trạng thái Nginx:
sudo systemctl status nginx
Cấu hình FirewallD: Mở các cổng HTTP (80) và HTTPS (443) để Nginx có thể hoạt động.
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Về SELinux: Fedora có SELinux được bật mặc định, một tính năng bảo mật rất quan trọng. Trong hầu hết các trường hợp, Nginx trên Fedora đã có các chính sách SELinux phù hợp. Tuy nhiên, nếu bạn gặp lỗi liên quan đến quyền truy cập file, hãy kiểm tra lại. Mình đã có bài viết về cấu hình SELinux, bạn có thể tham khảo thêm nếu cần tùy chỉnh.
2. Cấu hình Nginx cho nhiều website (HTTP)
Nginx sử dụng khái niệm “server block” (tương tự virtual host của Apache) để định nghĩa cấu hình cho từng website. Mình sẽ tạo các thư mục riêng cho từng website và các file cấu hình tương ứng.
Tạo thư mục gốc cho các website:
sudo mkdir -p /var/www/site1.com/html
sudo mkdir -p /var/www/site2.com/html
Cấp quyền phù hợp (ví dụ, cho user Nginx đọc và thực thi, và user của bạn có thể ghi):
sudo chown -R $USER:$USER /var/www/site1.com/html
sudo chown -R $USER:$USER /var/www/site2.com/html
sudo chmod -R 755 /var/www
Tạo một file index.html đơn giản trong mỗi thư mục để kiểm tra:
echo "<h1>Welcome to Site 1!</h1>" | sudo tee /var/www/site1.com/html/index.html
echo "<h1>Welcome to Site 2!</h1>" | sudo tee /var/www/site2.com/html/index.html
Tạo file cấu hình Nginx cho từng website:
Mình sẽ tạo các file .conf riêng biệt trong thư mục /etc/nginx/conf.d/. Nginx sẽ tự động load các file này.
File /etc/nginx/conf.d/site1.com.conf:
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
File /etc/nginx/conf.d/site2.com.conf:
server {
listen 80;
listen [::]:80;
server_name site2.com www.site2.com;
root /var/www/site2.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Kiểm tra và khởi động lại Nginx:
sudo nginx -t
sudo systemctl reload nginx
Lúc này, nếu bạn truy cập http://site1.com và http://site2.com (đảm bảo DNS đã trỏ về IP của server hoặc bạn đã cấu hình /etc/hosts trên máy cục bộ), bạn sẽ thấy nội dung của từng website.
3. Cài đặt Certbot và lấy chứng chỉ Let’s Encrypt
Certbot là công cụ chính thức từ Let’s Encrypt để tự động hóa việc cấp phát và gia hạn chứng chỉ. Fedora cung cấp gói Certbot tích hợp với Nginx rất tiện lợi.
Cài đặt Certbot và plugin Nginx:
sudo dnf install certbot python3-certbot-nginx -y
Chạy Certbot để lấy và cấu hình chứng chỉ:
sudo certbot --nginx -d site1.com -d www.site1.com -d site2.com -d www.site2.com
Certbot sẽ hỏi bạn một vài thông tin:
- Địa chỉ email để nhận thông báo khẩn cấp và gia hạn.
- Đồng ý với các điều khoản dịch vụ (Terms of Service).
- Bạn có muốn chia sẻ địa chỉ email với EFF (Electronic Frontier Foundation) không (tùy chọn).
- Quan trọng nhất, Certbot sẽ hỏi bạn có muốn tự động chuyển hướng HTTP sang HTTPS không. Mình khuyên nên chọn tùy chọn này để đảm bảo tất cả lưu lượng truy cập đều được bảo mật.
Sau khi hoàn tất, Certbot sẽ tự động chỉnh sửa các file cấu hình Nginx của bạn để thêm các directives cần thiết cho HTTPS và SSL.
4. Tối ưu cấu hình Nginx với HTTPS
Certbot thường làm rất tốt việc tự động cấu hình HTTPS. Sau khi chạy Certbot, bạn có thể kiểm tra lại các file cấu hình trong /etc/nginx/conf.d/. Chúng sẽ trông tương tự như thế này (ví dụ cho site1.com.conf):
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
# Redirect HTTP to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html index.htm;
ssl_certificate /etc/letsencrypt/live/site1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ =404;
}
}
Bạn có thể thấy một server block mới cho cổng 443 (HTTPS) với các dòng ssl_certificate và ssl_certificate_key trỏ đến các file chứng chỉ của Let’s Encrypt. Ngoài ra, server block cho cổng 80 (HTTP) đã được cấu hình để chuyển hướng sang HTTPS.
Kiểm tra và khởi động lại Nginx lần nữa:
sudo nginx -t
sudo systemctl reload nginx
5. Tự động gia hạn chứng chỉ
Chứng chỉ Let’s Encrypt chỉ có hiệu lực 90 ngày. Để đảm bảo website của bạn không bị gián đoạn, bạn cần thiết lập gia hạn tự động. Certbot đã tự động tạo một timer trong systemd để thực hiện việc này.
Bạn có thể kiểm tra xem timer này đã được cài đặt chưa:
systemctl list-timers | grep certbot
Nếu có kết quả tương tự certbot.timer, nghĩa là đã được cài đặt thành công. Certbot sẽ tự động chạy lệnh certbot renew định kỳ (thường là hai lần một ngày). Lệnh này sẽ kiểm tra xem chứng chỉ nào sắp hết hạn và gia hạn chúng nếu cần.
Bạn có thể chạy thử quá trình gia hạn mà không thực sự thay đổi chứng chỉ bằng lệnh:
sudo certbot renew --dry-run
6. Kiểm tra và xác thực
Sau khi hoàn tất cấu hình, việc kiểm tra là rất quan trọng.
- Truy cập website: Mở trình duyệt và truy cập
https://site1.comvàhttps://site2.com. Bạn sẽ thấy biểu tượng ổ khóa xanh lá cây, xác nhận kết nối đã được bảo mật. - Kiểm tra chất lượng SSL: Sử dụng công cụ SSL Labs Server Test. Nhập tên miền của bạn vào và công cụ này sẽ phân tích chi tiết cấu hình SSL của bạn, đưa ra điểm số (thường là A hoặc A+ nếu mọi thứ được cấu hình đúng).
Tổng kết
Việc cấu hình Nginx và Let’s Encrypt trên Fedora để host nhiều website giờ đây đã trở nên dễ dàng và hiệu quả hơn bao giờ hết. Với kinh nghiệm cá nhân của mình, sự kết hợp này mang lại một nền tảng web server mạnh mẽ, an toàn và dễ quản lý, tận dụng được những ưu điểm về hiệu năng của Nginx và khả năng cập nhật nhanh chóng của Fedora. Hy vọng qua bài viết này, bạn đã có đủ kiến thức và tự tin để triển khai các website của riêng mình trên nền tảng Fedora vững chắc.

