Khi hệ thống Microservices bắt đầu “phình to”
Trong quá trình nâng cấp hạ tầng từ CentOS 7 lên CentOS Stream 9, mình nhận ra cài đặt OS không khó, quản lý traffic mới là bài toán hóc búa. Khi bạn sở hữu hàng chục service Node.js, Python hay Go chạy trên các port lẻ tẻ như 3000, 8000, 5000, việc mở port trực tiếp cho client truy cập là một sai lầm nghiêm trọng về bảo mật.
Nginx lúc này đóng vai trò như một chốt chặn đáng tin cậy. Sau 6 tháng vận hành thực tế trên hệ thống có khoảng 50.000 request/phút, mình thấy Nginx trên CentOS Stream 9 cực kỳ ổn định. Nó không chỉ che giấu backend mà còn đảm nhận việc chia tải (Load Balancing) và mã hóa (SSL), giúp server phía sau rảnh tay xử lý logic nghiệp vụ.
Vì sao nên chọn Nginx thay vì Apache?
Nhiều anh em vẫn ưu ái Apache vì sự quen thuộc. Tuy nhiên, nếu ưu tiên khả năng xử lý hàng nghìn kết nối đồng thời (concurrency) với mức chiếm dụng RAM cực thấp, Nginx vẫn là “vua”. Trên CentOS Stream 9, Nginx phối hợp rất mượt với dnf và systemd. Đặc biệt, sự kết hợp với SELinux tạo nên một lớp bảo mật cực kỳ chặt chẽ cho môi trường production.
Sơ đồ hoạt động rất đơn giản: User → Internet → Nginx (Port 80/443) → Backend Services. Nginx đứng ở giữa, đóng vai trò điều phối toàn bộ luồng dữ liệu.
Bước 1: Cài đặt và chuẩn bị môi trường
Trước hết, hãy cập nhật hệ thống để đảm bảo các thư viện bảo mật luôn ở bản mới nhất.
sudo dnf update -y
sudo dnf install nginx -y
Kích hoạt service để Nginx tự động khởi chạy cùng hệ thống:
sudo systemctl enable --now nginx
sudo systemctl status nginx
Đừng quên mở Firewall. Trên CentOS Stream 9, đây là bước dễ gây quên nhất khiến bạn không thể truy cập website dù dịch vụ đã chạy.
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Bước 2: Cấu hình Reverse Proxy thực tế
Thay vì can thiệp vào file nginx.conf gốc, mình thường tạo file riêng trong /etc/nginx/conf.d/. Cách này giúp bạn quản lý hàng chục domain khác nhau mà không lo cấu hình chồng chéo.
Ví dụ, để điều hướng traffic vào một app Node.js tại port 3000, bạn tạo file /etc/nginx/conf.d/app.conf:
server {
listen 80;
server_name app.itfromzero.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Mẹo nhỏ: Các dòng proxy_set_header cực kỳ quan trọng. Nếu thiếu, backend sẽ hiểu nhầm mọi request đều đến từ IP nội bộ 127.0.0.1, gây sai lệch cho các logic về định danh hoặc giới hạn tốc độ (rate limiting).
Bước 3: Tối ưu Load Balancing cho hệ thống lớn
Khi lượng người dùng tăng vọt, một backend duy nhất sẽ dễ bị quá tải. Lúc này, kỹ thuật upstream sẽ phát huy tác dụng. Nginx sẽ tự động phân phối request đến danh sách các server bạn chỉ định.
upstream backend_servers {
least_conn; # Ưu tiên server đang ít kết nối nhất
server 192.168.1.10:3000 weight=3;
server 192.168.1.11:3000;
server 192.168.1.12:3000 backup;
}
server {
listen 80;
server_name app.itfromzero.com;
location / {
proxy_pass http://backend_servers;
}
}
Trong thực tế, mình ưu tiên least_conn thay vì Round Robin mặc định. Nó xử lý thông minh hơn khi các request có độ nặng nhẹ khác nhau. Ngoài ra, tham số weight giúp tận dụng tối đa sức mạnh của những con server có cấu hình CPU/RAM khủng hơn.
Bước 4: Cài đặt SSL Let’s Encrypt trong 30 giây
Chạy web không có HTTPS hiện nay gần như là điều không thể. Nginx sẽ đảm nhận việc giải mã SSL (SSL Termination). Điều này giúp backend tiết kiệm khoảng 20-30% tài nguyên CPU do không phải lo việc mã hóa dữ liệu.
Sử dụng Certbot là cách nhanh nhất để tự động hóa chứng chỉ:
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-nginx -y
sudo certbot --nginx -d app.itfromzero.com
Certbot sẽ tự động chỉnh sửa cấu hình Nginx và thiết lập cơ chế tự động gia hạn. Bạn không cần phải nhớ ngày hết hạn của chứng chỉ nữa.
Xử lý lỗi “502 Bad Gateway” do SELinux
Đây là phần gây ức chế nhất cho những người mới dùng CentOS. Dù Nginx đúng, Firewall mở, backend vẫn chạy, nhưng bạn vẫn nhận lỗi 502. Log Nginx sẽ báo “Permission denied”.
Thủ phạm chính là SELinux. Theo mặc định, nó chặn không cho Nginx thực hiện kết nối mạng ra ngoài. Để xử lý triệt để, hãy chạy lệnh:
sudo setsebool -P httpd_can_network_connect 1
Flag -P đảm bảo cấu hình này không bị mất đi khi reboot server. Tuyệt đối đừng tắt SELinux (setenforce 0) vì nó sẽ làm yếu đi lớp phòng thủ quan trọng nhất của hệ thống.
Kết luận
Nginx trên CentOS Stream 9 thực sự rất lợi hại nếu bạn biết cách làm chủ upstream và xử lý SELinux. Việc tách biệt lớp Proxy giúp hạ tầng của bạn linh hoạt hơn: dễ dàng bảo trì server cũ hoặc thêm backend mới mà không cần chạm vào code ứng dụng. Một lưu ý cuối cùng: Luôn chạy nginx -t trước khi restart để tránh làm gián đoạn hệ thống do lỗi cú pháp.

