Bài viết này của ThueVPSgiare.com.vn sẽ hướng dẫn bạn chi tiết quy trình cài đặt và cấu hình Nginx trên hai hệ điều hành máy chủ phổ biến nhất: Ubuntu và CentOS. Chúng tôi sẽ đi từ những khái niệm cơ bản, qua các bước cài đặt cụ thể, đến các kỹ thuật nâng cao như cấu hình Reverse Proxy, bật HTTPS với Let’s Encrypt và các phương pháp tối ưu, bảo mật thiết yếu cho môi trường production.

Nginx là gì? Khi nào nên dùng thay cho Apache?

Nginx (phát âm là “engine-x”) là một web server mã nguồn mở hiệu năng cao. Ban đầu, Nginx được tạo ra để giải quyết bài toán C10k – xử lý mười nghìn kết nối đồng thời trên một máy chủ.

Điểm làm nên sức mạnh của Nginx là kiến trúc bất đồng bộ, điều khiển bởi sự kiện (event-driven). Thay vì tạo một tiến trình (process) hoặc luồng (thread) mới cho mỗi yêu cầu như Apache, Nginx sử dụng một tiến trình worker duy nhất để xử lý hàng nghìn kết nối. Cách tiếp cận này giúp Nginx tiêu thụ bộ nhớ cực kỳ hiệu quả và có hiệu năng vượt trội, đặc biệt khi phục vụ nội dung tĩnh hoặc có lượng truy cập đồng thời lớn.

Những lợi ích của Nginx Web Server

Theo khảo sát của W3Techs vào tháng 8 năm 2025, Nginx được sử dụng bởi 34.2% tất cả các website trên thế giới, cho thấy sự phổ biến và tin cậy của nó.

Bạn nên chọn Nginx khi:

  • Phục vụ nội dung tĩnh: Hình ảnh, CSS, JavaScript.
  • Làm Reverse Proxy: Đứng trước các application server (Node.js, Python, Java) để điều phối request.
  • Làm Load Balancer (Bộ cân bằng tải): Phân phối lưu lượng truy cập đến nhiều máy chủ backend.
  • Xây dựng API Gateway: Quản lý các điểm cuối API.
  • Kiến trúc Microservices: Nginx hoạt động hiệu quả như một cổng vào cho các dịch vụ nhỏ lẻ.

Apache vẫn là một lựa chọn mạnh mẽ cho các môi trường shared hosting truyền thống hoặc các ứng dụng yêu cầu cấu hình linh hoạt thông qua file .htaccess. Tuy nhiên, với các ứng dụng hiện đại, Nginx thường là lựa chọn ưu tiên về hiệu năng.

Yêu cầu & chuẩn bị trước khi cài đặt

Để quá trình cài đặt diễn ra suôn sẻ, bạn cần đảm bảo các yếu tố sau:

  • Hệ điều hành: Một máy chủ đang chạy phiên bản Ubuntu (20.04, 22.04, 24.04) hoặc CentOS/AlmaLinux/Rocky Linux (7, 8, 9) còn được hỗ trợ.
  • Quyền truy cập: Tài khoản người dùng có quyền sudo.
  • Hệ thống cập nhật: Luôn cập nhật hệ thống để vá các lỗ hổng bảo mật và đảm bảo tương thích gói phần mềm.
  • Tên miền (Tùy chọn nhưng khuyến khích): Một tên miền đã được trỏ A record về địa chỉ IP public của máy chủ. Điều này là bắt buộc nếu bạn muốn cài đặt chứng chỉ SSL/TLS.
  • Mở Port: Đảm bảo tường lửa của bạn cho phép lưu lượng truy cập qua port 80 (HTTP)443 (HTTPS).
  • Đồng bộ thời gian: Thời gian hệ thống chính xác là yếu tố quan trọng cho việc xác thực SSL và ghi log.
 

Khác biệt Ubuntu vs CentOS bạn cần nắm

Hiểu rõ sự khác biệt giữa hai hệ điều hành sẽ giúp bạn xử lý sự cố hiệu quả hơn.

Yếu tố Ubuntu (Hệ Debian) CentOS/AlmaLinux/Rocky (Hệ RHEL)
Trình quản lý gói apt yum (CentOS 7) / dnf (CentOS 8+)
Tường lửa mặc định UFW (Uncomplicated Firewall) firewalld
Cơ chế bảo mật AppArmor SELinux (Bật mặc định, rất nghiêm ngặt)
Cấu trúc cấu hình /etc/nginx/sites-available/<br>/etc/nginx/sites-enabled/ /etc/nginx/conf.d/
User chạy dịch vụ www-data nginx

Điểm khác biệt lớn nhất bạn cần lưu ý là SELinux trên CentOS. Rất nhiều lỗi “403 Forbidden” không phải do quyền file (chmod) mà do SELinux chặn Nginx truy cập vào thư mục webroot.

Cài đặt Nginx trên Ubuntu (20.04/22.04/24.04)

Quy trình trên Ubuntu rất đơn giản vì Nginx có sẵn trong kho lưu trữ mặc định.

Cài đặt và khởi động dịch vụ

  1. Cập nhật danh sách gói: Luôn bắt đầu bằng việc làm mới danh sách gói phần mềm của bạn.
    sudo apt update
  2. Cài đặt Nginx: Thực thi lệnh sau để cài đặt gói Nginx.
    sudo apt install nginx
  3. Khởi động và kích hoạt Nginx: Lệnh enable --now sẽ khởi động Nginx ngay lập tức và thiết lập để nó tự chạy mỗi khi máy chủ khởi động lại.
    sudo systemctl enable --now nginx
  4. Kiểm tra trạng thái: Bạn có thể xác nhận Nginx đang chạy ổn định bằng lệnh sau.
    systemctl status ngin

    Nếu thấy dòng active (running) màu xanh, bạn đã thành công.

Mở tường lửa UFW

Nếu bạn đang sử dụng tường lửa UFW, bạn cần cho phép Nginx đi qua.

  1. Liệt kê các cấu hình ứng dụng UFW:
    sudo ufw app list

    Bạn sẽ thấy các tùy chọn: ‘Nginx Full’ (cho phép port 80 và 443), ‘Nginx HTTP’, ‘Nginx HTTPS’.

  2. Cho phép lưu lượng truy cập: Cách đơn giản nhất là cho phép cả hai.
    sudo ufw allow 'Nginx Full'
  3. Kiểm tra trạng thái tường lửa:
    sudo ufw status

    Bạn sẽ thấy các rule cho Nginx đã được thêm vào.

Cấu trúc thư mục & file cấu hình

  • /etc/nginx/nginx.conf: File cấu hình chính, nơi bạn thiết lập các thông số toàn cục như số lượng worker processes.
  • /etc/nginx/sites-available/: Nơi chứa tất cả các file cấu hình server block (tương tự Virtual Host của Apache). Mỗi website nên có một file riêng tại đây.
  • /etc/nginx/sites-enabled/: Nơi chứa các liên kết tượng trưng (symbolic link) đến các file cấu hình trong sites-available mà bạn muốn kích hoạt.
  • /var/log/nginx/: Thư mục chứa log truy cập (access.log) và log lỗi (error.log).

Tạo server block cho tên miền

Giả sử bạn có tên miền your_domain.com.

  1. Tạo thư mục cho website:
    sudo mkdir -p /var/www/your_domain.com/html
  2. Tạo file index.html để thử nghiệm:
    echo "<h1>Success! The your_domain.com server block is working!</h1>" | sudo tee /var/www/your_domain.com/html/index.html
  3. Tạo file cấu hình server block: Sử dụng một trình soạn thảo văn bản như nano để tạo file cấu hình mới.
    sudo nano /etc/nginx/sites-available/your_domain.com

    Dán nội dung sau vào file:

    server {
        listen 80;
        listen [::]:80;
    
        root /var/www/your_domain.com/html;
        index index.html index.htm;
    
        server_name your_domain.com www.your_domain.com;
    
        location / {
            try_files $uri $uri/ =404;
        }
    
        access_log /var/log/nginx/your_domain.com.access.log;
        error_log /var/log/nginx/your_domain.com.error.log;
    }
  4. Kích hoạt server block: Tạo một symbolic link từ sites-available sang sites-enabled.
    sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
  5. Kiểm tra cú pháp và áp dụng cấu hình: Luôn kiểm tra cú pháp trước khi reload để tránh làm sập dịch vụ.
    sudo nginx -t

    Nếu nhận được thông báo syntax is oktest is successful, hãy reload Nginx.

    sudo systemctl reload nginx

    Bây giờ, bạn có thể truy cập http://your_domain.com trên trình duyệt để thấy trang chào mừng.

Cài đặt Nginx trên CentOS/AlmaLinux/Rocky

Trên các bản phân phối RHEL, Nginx thường được cài từ kho EPEL hoặc qua Module Stream.

Cài đặt và khởi động dịch vụ

  • Trên CentOS 7: Bạn cần cài kho EPEL (Extra Packages for Enterprise Linux) trước.
    sudo yum install epel-release
    sudo yum install nginx
  • Trên CentOS 8/9 và các bản clone: Nginx có sẵn trong AppStream.
    sudo dnf install nginx

Sau khi cài đặt, hãy khởi động và kích hoạt dịch vụ.

sudo systemctl enable --now nginx

Mở tường lửa firewalld

  1. Thêm rule cho HTTP và HTTPS:
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
  2. Reload tường lửa để áp dụng:
    sudo firewall-cmd --reload

SELinux & quyền truy cập

Đây là bước quan trọng nhất và thường bị bỏ qua. Nếu bạn tạo thư mục webroot ở một vị trí khác /usr/share/nginx/html, SELinux sẽ chặn Nginx truy cập.

  1. Gán context cho thư mục webroot: Giả sử bạn tạo thư mục /var/www/your_domain.com.
    sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/your_domain.com(/.*)?"
    sudo restorecon -Rv /var/www/your_domain.com
  2. Cho phép Nginx kết nối mạng (khi làm reverse proxy):
    sudo setsebool -P httpd_can_network_connect 1

Nếu gặp lỗi 403 Forbidden dù đã chmod đúng, hãy kiểm tra log của SELinux bằng audit2why < /var/log/audit/audit.log.

Tạo vhost trong /etc/nginx/conf.d/

Trên CentOS, bạn không cần sites-available. Chỉ cần tạo file .conf trong /etc/nginx/conf.d/.

  1. Tạo file cấu hình:
    sudo nano /etc/nginx/conf.d/your_domain.com.conf
  2. Dán nội dung cấu hình (tương tự Ubuntu):
    server {
        listen 80;
        listen [::]:80;
    
        server_name your_domain.com www.your_domain.com;
    
        root /var/www/your_domain.com/html;
        index index.html index.htm;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
  3. Kiểm tra và reload Nginx:
    sudo nginx -t
    sudo systemctl reload nginx

Cấu hình reverse proxy & upstream cơ bản

Reverse proxy là một trong những ứng dụng mạnh mẽ nhất của Nginx. Nginx sẽ nhận request từ client và chuyển tiếp đến một server ứng dụng backend (ví dụ: một app Node.js chạy ở port 3000).

Khối upstream cho phép bạn định nghĩa một nhóm các server backend.

Mẫu cấu hình reverse proxy

Đây là một ví dụ cấu hình Nginx làm reverse proxy cho một ứng dụng chạy ở localhost:3000.

upstream my_backend_app {
    server 127.0.0.1:3000;
    # Thêm các server khác ở đây để cân bằng tải
    # server 127.0.0.1:3001;
}

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://my_backend_app;
        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;

        # Tùy chọn nâng cao
        proxy_read_timeout 90;
        proxy_buffering off;
    }
}
  • proxy_pass: Chỉ thị cốt lõi, chuyển tiếp request đến upstream.
  • proxy_set_header: Gửi các header quan trọng đến backend để ứng dụng biết được thông tin gốc của request.
  • proxy_buffering off: Hữu ích cho các ứng dụng streaming hoặc có kết nối long-polling.

Bật HTTPS với Let’s Encrypt (Certbot)

Trong môi trường production, HTTPS là bắt buộc. Certbot là công cụ giúp tự động hóa việc lấy và gia hạn chứng chỉ SSL miễn phí từ Let’s Encrypt.

Cài Certbot trên Ubuntu/CentOS

  • Trên Ubuntu:
    sudo apt install certbot python3-certbot-nginx
  • Trên CentOS:
    sudo dnf install certbot python3-certbot-nginx

Cấp chứng chỉ & cấu hình tự động

Chạy Certbot với plugin Nginx. Certbot sẽ tự động đọc các server block của bạn, cấp chứng chỉ và sửa file cấu hình để bật HTTPS.

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

Certbot sẽ hỏi bạn một vài câu hỏi, bao gồm cả việc có muốn tự động chuyển hướng HTTP sang HTTPS không (chọn tùy chọn này).

Sau khi hoàn tất, Certbot cũng sẽ tạo một timer systemd để tự động gia hạn chứng chỉ trước khi hết hạn. Bạn có thể kiểm tra bằng:

systemctl status certbot.timer

Tối ưu hiệu suất & bảo mật cơ bản

Sau khi cài đặt, hãy áp dụng các tinh chỉnh sau:

  • Bật nén Gzip: Giảm kích thước file text (HTML, CSS, JS) gửi đến client. Thêm vào khối http trong nginx.conf:
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  • Bật HTTP/2: Tăng tốc độ tải trang qua multiplexing. Trong khối server, sửa dòng listen:
    listen 443 ssl http2;
  • Thiết lập Cache cho nội dung tĩnh: Yêu cầu trình duyệt lưu cache các file tĩnh.
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
    }
  • Ẩn phiên bản Nginx: Tránh để lộ thông tin cho kẻ tấn công. Trong nginx.conf, thêm server_tokens off;.
  • Thêm Security Headers: Giảm thiểu rủi ro từ các cuộc tấn công XSS, clickjacking.
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

Kiểm tra & xử lý lỗi thường gặp

  • Lỗi 403 Forbidden: Thường do quyền file/thư mục sai (chmod) hoặc bị SELinux (trên CentOS) chặn.
  • Lỗi 502 Bad Gateway: Ứng dụng backend (upstream) của bạn đã bị sập, không chạy hoặc cấu hình proxy_pass sai.
  • Lỗi 504 Gateway Timeout: Ứng dụng backend mất quá nhiều thời gian để xử lý request. Cần tối ưu code hoặc tăng proxy_read_timeout.
  • Lỗi failed to bind 0.0.0.0:80: Một dịch vụ khác (thường là Apache) đang chiếm cổng 80. Dùng sudo lsof -i :80 để kiểm tra.
  • Lỗi cú pháp nginx: [emerg]: Luôn chạy sudo nginx -t sau khi sửa file cấu hình. Lệnh này sẽ chỉ rõ file và dòng bị lỗi.

Giám sát, log và bảo trì định kỳ

  • Log: Thường xuyên kiểm tra /var/log/nginx/error.log để phát hiện sự cố.
  • Logrotate: Hệ thống thường đã cấu hình logrotate cho Nginx để nén và xoay vòng các file log cũ, tránh làm đầy ổ đĩa.
  • Reload an toàn: Luôn dùng sudo systemctl reload nginx thay vì restart để áp dụng cấu hình mới mà không làm mất các kết nối hiện tại.
  • Cập nhật: Thường xuyên chạy apt upgrade hoặc dnf update để cập nhật Nginx lên phiên bản mới nhất, vá các lỗi bảo mật.
  • Backup: Sao lưu thư mục /etc/nginx/ trước khi thực hiện các thay đổi lớn.

Câu hỏi thường gặp (FAQ)

Nginx hay Apache phù hợp cho WordPress/website động?

Cả hai đều hoạt động tốt. Tuy nhiên, Nginx thường được ưa chuộng hơn khi kết hợp với PHP-FPM do hiệu năng xử lý request cao hơn. Một cấu hình phổ biến là dùng Nginx làm reverse proxy cho Apache để tận dụng sức mạnh của cả hai.

Có thể host nhiều website/vhost trên một server Nginx không?

Hoàn toàn có thể. Bạn chỉ cần tạo các file server block riêng biệt cho mỗi website như đã hướng dẫn ở trên. Nginx sẽ dùng server_name để định tuyến request đến đúng thư mục của website đó.

Cách chuyển từ Apache sang Nginx mà không downtime?

Cách an toàn là cài đặt Nginx chạy trên một port khác (ví dụ: 8080). Cấu hình và kiểm tra toàn bộ website trên port đó. Khi mọi thứ đã sẵn sàng, bạn dừng Apache, đổi port của Nginx về 80/443 và khởi động lại Nginx. Quá trình này chỉ mất vài giây.

Chọn Ubuntu hay CentOS/Alma/Rocky cho Nginx trong production?

Cả hai đều là lựa chọn ổn định. Ubuntu có chu kỳ phát hành nhanh hơn và các gói phần mềm mới hơn. CentOS/RHEL nổi tiếng về sự ổn định và hỗ trợ dài hạn, phù hợp cho môi trường doanh nghiệp yêu cầu tính nhất quán cao. Lựa chọn phụ thuộc vào sự quen thuộc và chính sách của đội ngũ quản trị.

Làm sao bật HTTP/3 và tối ưu TLS nhanh chóng?

HTTP/3 yêu cầu Nginx được biên dịch với thư viện QUIC. Cách dễ nhất là sử dụng các bản build tùy chỉnh từ các nhà phát triển cộng đồng hoặc dùng các container Docker đã được cấu hình sẵn. Tối ưu TLS bao gồm việc chọn các bộ mật mã (cipher suite) mạnh và bật OCSP Stapling.

Checklist triển khai nhanh

Sử dụng danh sách này để kiểm tra nhanh các bước khi triển khai:

  1. [ ] Cập nhật hệ thống (apt/dnf update).
  2. [ ] Cài đặt gói Nginx.
  3. [ ] Khởi động và kích hoạt dịch vụ Nginx.
  4. [ ] Mở port 80/443 trên tường lửa (ufw/firewalld).
  5. [ ] Tạo thư mục webroot và gán quyền.
  6. [ ] (CentOS) Gán context SELinux cho webroot.
  7. [ ] Tạo file cấu hình server block cho tên miền.
  8. [ ] (Ubuntu) Kích hoạt server block bằng symbolic link.
  9. [ ] Kiểm tra cú pháp (nginx -t).
  10. [ ] Reload Nginx.
  11. [ ] Cài đặt Certbot và lấy chứng chỉ SSL.
  12. [ ] Áp dụng các tối ưu cơ bản (Gzip, HTTP/2, Cache).
  13. [ ] Thường xuyên giám sát log.

Nếu bạn đang tìm dịch vụ VPS Linux để triển khai dự án, hãy tham khảo ThueVPSgiare.com.vn– Nhà cung cấp VPS uy tín, chất lượng giá rẻ hàng đầu tại Việt Nam.