Hướng dẫn cài đặt và quản lý Nginx trên Ubuntu

Ngày đăng: July 17, 2025

Ubuntu

description image Nginx là một trong những máy chủ web phổ biến nhất trên thế giới và chịu trách nhiệm lưu trữ một số trang web có lưu lượng truy cập lớn nhất trên internet. Đây là một lựa chọn nhẹ có thể được dùng làm máy chủ web hoặc reverse proxy.

Trong hướng dẫn này, chúng ta sẽ thảo luận cách cài đặt Nginx trên máy chủ Ubuntu của bạn, điều chỉnh tường lửa, quản lý tiến trình Nginx và thiết lập các block máy chủ để lưu trữ nhiều hơn một miền từ một máy chủ duy nhất.


Các yêu cầu trước

Trước khi bắt đầu hướng dẫn này, bạn nên có một người dùng thường (không phải root) với quyền sudo được cấu hình trên máy chủ của bạn. Bạn có thể tìm hiểu cách cấu hình tài khoản người dùng thường theo hướng dẫn Thiết lập máy chủ ban đầu cho Ubuntu.

Bạn cũng nên đăng ký một tên miền trước khi hoàn thành các bước cuối cùng của bài hướng dẫn này. Để tìm hiểu thêm về cách thiết lập tên miền với DigitalOcean, vui lòng tham khảo Giới thiệu về DNS của DigitalOcean.

Khi bạn đã có tài khoản, đăng nhập với người dùng không phải root để bắt đầu.


Bước 1 – Cài đặt Nginx

Vì Nginx có sẵn trong kho mặc định của Ubuntu, bạn có thể cài đặt nó từ kho này bằng hệ thống đóng gói apt.

Do đây là lần đầu tiên chúng ta sử dụng hệ thống gói apt trong phiên làm việc này, chúng ta sẽ cập nhật chỉ mục gói cục bộ để có quyền truy cập đến danh sách gói mới nhất. Sau đó, chúng ta có thể cài đặt nginx:

$ sudo apt update
$ sudo apt install nginx

Sau khi chấp nhận thao tác này, apt sẽ cài đặt Nginx và các phụ thuộc cần thiết lên máy chủ của bạn.


Bước 2 – Điều chỉnh tường lửa

Trước khi kiểm tra Nginx, phần mềm tường lửa cần được điều chỉnh để cho phép truy cập dịch vụ. Nginx tự đăng ký dưới dạng một dịch vụ với ufw khi được cài đặt, khiến việc cho phép truy cập Nginx trở nên đơn giản.

Liệt kê các cấu hình ứng dụng mà ufw hỗ trợ bằng cách nhập:

$ sudo ufw app list

Bạn sẽ nhận được danh sách các cấu hình ứng dụng:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Như trong đầu ra, có ba cấu hình sẵn có cho Nginx:

  • Nginx Full: Mở cả cổng 80 (lưu lượng web không mã hóa bình thường) và cổng 443 (lưu lượng TLS/SSL mã hóa).
  • Nginx HTTP: Chỉ mở cổng 80 (lưu lượng web không mã hóa bình thường).
  • Nginx HTTPS: Chỉ mở cổng 443 (lưu lượng TLS/SSL mã hóa).

Khuyến nghị bạn bật cấu hình hạn chế nhất mà vẫn cho phép lưu lượng bạn đã cấu hình. Hiện tại, chúng ta chỉ cần cho phép lưu lượng trên cổng 80.

Bạn có thể bật bằng cách nhập:

$ sudo ufw allow 'Nginx HTTP'

Bạn có thể xác nhận thay đổi bằng cách nhập:

$ sudo ufw status

Đầu ra sẽ cho biết lưu lượng HTTP nào được cho phép:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Bước 3 – Kiểm tra máy chủ web của bạn

Sau khi hoàn tất quá trình cài đặt, Ubuntu sẽ khởi động Nginx. Máy chủ web có thể đã hoạt động.

Bạn có thể kiểm tra với hệ thống init systemd bằng cách nhập:

$ systemctl status nginx

Đầu ra sẽ cho biết dịch vụ đã bắt đầu thành công:

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-20 16:08:19 UTC; 3 days ago
     Docs: man:nginx(8)
 Main PID: 2369 (nginx)
    Tasks: 2 (limit: 1153)
   Memory: 3.5M
   CGroup: /system.slice/nginx.service
           ├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─2380 nginx: worker process

Tuy nhiên, cách tốt nhất để kiểm tra là thực sự yêu cầu một trang từ Nginx.

Bạn có thể truy cập trang mặc định của Nginx để xác nhận phần mềm hoạt động đúng bằng cách truy cập địa chỉ IP của máy chủ bạn. Nếu bạn không biết IP máy chủ, có thể sử dụng công cụ icanhazip.com để lấy địa chỉ IP công cộng:

$ curl -4 icanhazip.com

Khi bạn có địa chỉ IP máy chủ, nhập nó vào thanh địa chỉ trình duyệt:

http://your_server_ip

Bạn sẽ nhận được trang đích mặc định của Nginx.

Nếu bạn đang xem trang này, máy chủ của bạn đang chạy chính xác và sẵn sàng để quản lý.


Bước 4 – Quản lý tiến trình Nginx

Bây giờ máy chủ web đã hoạt động, hãy xem qua một số lệnh quản lý cơ bản.

Để dừng máy chủ, nhập:

$ sudo systemctl stop nginx

Để khởi động lại máy chủ khi đã dừng, nhập:

$ sudo systemctl start nginx

Để dừng rồi khởi động lại dịch vụ, nhập:

$ sudo systemctl restart nginx

Nếu chỉ thực hiện thay đổi cấu hình, Nginx có thể tải lại mà không hủy kết nối bằng lệnh:

$ sudo systemctl reload nginx

Theo mặc định, Nginx tự động khởi động cùng máy chủ. Nếu không muốn, có thể tắt bằng:

$ sudo systemctl disable nginx

Để bật lại khởi động tự động, dùng:

$ sudo systemctl enable nginx

Bạn đã nắm các lệnh quản lý cơ bản và có thể sẵn sàng cấu hình máy chủ để lưu trữ nhiều hơn một miền.


Bước 5 – Thiết lập Server Blocks (Khuyến nghị)

Khi dùng máy chủ Nginx, <em>server blocks</em> (tương tự như virtual hosts trong Apache) có thể sử dụng để đóng gói chi tiết cấu hình và lưu trữ nhiều hơn một miền trên một máy chủ duy nhất. Chúng ta sẽ thiết lập một miền có tên là your_domain, nhưng bạn nên thay thế bằng tên miền của riêng bạn.

Nginx trên Ubuntu mặc định có một server block được bật, cấu hình phục vụ tài liệu từ thư mục /var/www/html. Mặc dù thích hợp cho một trang web đơn, nếu lưu trữ nhiều trang, nó có thể trở nên khó quản lý. Thay vì sửa đổi /var/www/html, hãy tạo cấu trúc thư mục trong /var/www cho site your_domain, và để nguyên /var/www/html làm thư mục mặc định khi yêu cầu không khớp các site khác.

Tạo thư mục cho your_domain như sau, với cờ -p để tạo các thư mục cha nếu cần:

$ sudo mkdir -p /var/www/your_domain/html

Tiếp theo, gán quyền sở hữu thư mục với biến môi trường $USER:

$ sudo chown -R $USER:$USER /var/www/your_domain/html

Đảm bảo quyền thư mục đúng, cho phép chủ sở hữu đọc, ghi, thực thi, nhóm và người khác chỉ đọc, thực thi:

$ sudo chmod -R 755 /var/www/your_domain

Tạo một trang mẫu index.html bằng nano hoặc trình soạn thảo yêu thích:

$ sudo nano /var/www/your_domain/html/index.html

Thêm HTML mẫu sau:

<html>
    <head>
        <title>Welcome to your_domain!</title>
    </head>
    <body>
        <h1>Success!  The your_domain server block is working!</h1>
    </body>
</html>

Lưu và đóng file với Ctrl+X, gõ Y rồi Enter.

Để Nginx phục vụ nội dung, cần tạo một server block với chỉ thị chính xác. Thay vì sửa trực tiếp config mặc định, tạo tệp mới tại /etc/nginx/sites-available/your_domain:

$ sudo nano /etc/nginx/sites-available/your_domain

Dán vào khối cấu hình sau, tương tự cấu hình mặc định, nhưng cập nhật thư mục và tên miền:

server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

Chú ý đã cập nhật rootserver_name.

Bây giờ, bật file này bằng cách tạo liên kết tới thư mục sites-enabled, nơi Nginx đọc trong lúc khởi động:

$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Lưu ý: Nginx sử dụng liên kết biểu tượng (symlink) để theo dõi các server block được bật. Tạo symlink như tạo lối tắt trên đĩa, giúp bạn có thể xóa lối tắt trong sites-enabled để tắt mà vẫn giữ server block gốc trong sites-available.

Có hai server block bật và cấu hình để phản hồi yêu cầu dựa trên chỉ thị listenserver_name:

  • your_domain: phản hồi cho các yêu cầu với your_domainwww.your_domain.
  • default: phản hồi các yêu cầu cổng 80 không khớp hai block trên.

Để tránh lỗi bộ nhớ bucket hash có thể xảy ra khi thêm tên server, cần điều chỉnh một giá trị trong /etc/nginx/nginx.conf. Mở file:

$ sudo nano /etc/nginx/nginx.conf

Tìm chỉ thị server_names_hash_bucket_size và bỏ dấu # để kích hoạt dòng này. Trong nano, dùng Ctrl+w để tìm kiếm.

Lưu ý: Bình luận dòng bằng dấu # là cách vô hiệu hóa mà không xóa mã, nhiều file cấu hình sử dụng phương pháp này để bật/tắt các tùy chọn.

Cấu hình mẫu trong nginx.conf như:

...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

Lưu và đóng file.

Kiểm tra cú pháp của các file Nginx:

$ sudo nginx -t

Nếu không lỗi, khởi động lại Nginx để áp dụng thay đổi:

$ sudo systemctl restart nginx

Nginx giờ sẽ phục vụ tên miền của bạn. Kiểm tra bằng cách truy cập http://your_domain và bạn sẽ thấy trang tương tự:

Nginx first server block


Bước 6 – Làm quen với các file và thư mục quan trọng của Nginx

Ở bước này, bạn nên dành vài phút làm quen với các thư mục và file quan trọng.

Nội dung

  • /var/www/html: Nội dung web thực tế, mặc định bao gồm trang mặc định Nginx bạn đã thấy, được phục vụ từ thư mục này. Có thể thay đổi bằng cách chỉnh file cấu hình Nginx.

Cấu hình máy chủ

  • /etc/nginx: Thư mục cấu hình Nginx, nơi chứa toàn bộ file cấu hình.
  • /etc/nginx/nginx.conf: File cấu hình chính của Nginx, chỉnh sửa để thay đổi cấu hình toàn cục.
  • /etc/nginx/sites-available/: Thư mục chứa các server blocks theo từng site. Nginx không dùng các file ở đây trừ khi có liên kết tới sites-enabled.
  • /etc/nginx/sites-enabled/: Chứa các server blocks được bật, thường tạo ra bằng cách liên kết file trong sites-available.
  • /etc/nginx/snippets: Chứa các đoạn cấu hình có thể tái sử dụng, giúp tái cấu trúc và tối ưu file cấu hình.

Nhật ký máy chủ

  • /var/log/nginx/access.log: Ghi lại tất cả yêu cầu tới máy chủ nếu không bị cấu hình bỏ qua.
  • /var/log/nginx/error.log: Ghi lại các lỗi Nginx xảy ra.

Tinh chỉnh hiệu năng cho máy chủ lưu lượng cao

Trong phần này, chúng ta sẽ thảo luận một số kỹ thuật nâng cao để tối ưu hiệu suất máy chủ Nginx, đặc biệt với các trang web có lưu lượng cao. Các kỹ thuật này gồm cân bằng tải, caching và tinh chỉnh cấu hình máy chủ. Bằng cách áp dụng, bạn có thể đảm bảo máy chủ xử lý nhiều yêu cầu đồng thời một cách hiệu quả và ổn định.

Cân bằng tải: Phân phối lưu lượng mạng đến nhiều máy chủ backend, tránh quá tải một máy chủ đơn lẻ. Có thể thiết lập cân bằng tải bằng HAProxy hoặc chính Nginx, hoặc dùng Load Balancer – dịch vụ cân bằng tải quản lý.

Caching: Lưu trữ dữ liệu truy cập thường xuyên trong bộ nhớ cache, giảm tần suất truy vấn nguồn gốc. Có thể dùng Redis hoặc Memcached, và cấu hình Nginx để sử dụng cache này.

Tinh chỉnh cấu hình: Điều chỉnh các thiết lập như số lượng tiến trình worker, kích thước buffer, thời gian chờ... thông qua việc chỉnh sửa các file cấu hình Nginx, dựa trên yêu cầu cụ thể của máy chủ và lưu lượng.


Thiết lập Nginx làm reverse proxy cho các ứng dụng Node.js, Python hoặc PHP

Nginx có thể dùng làm để định tuyến yêu cầu đến các ứng dụng hoặc dịch vụ khác nhau. Điều này hữu ích khi bạn chạy nhiều ứng dụng trên cùng máy chủ và muốn quản lý như một thể thống nhất.

Để thiết lập Nginx làm reverse proxy, cần tạo một server block trong thư mục sites-available và cấu hình để lắng nghe các yêu cầu trên cổng cụ thể. Sau đó dùng chỉ thị proxy_pass để chuyển tiếp yêu cầu đến ứng dụng backend phù hợp.

Ví dụ, nếu bạn có ứng dụng Node.js chạy trên cổng 3000, có thể tạo server block như sau:

server {
    listen 80;
    server_name your_domain;
    location / {
        proxy_pass http://localhost:3000;
    }
}

Khắc phục các lỗi phổ biến của Nginx

Khi làm việc với Nginx, bạn có thể gặp lỗi gây khó chịu. Phần này sẽ đề cập một số lỗi phổ biến, nguyên nhân và cách khắc phục.

1. Lỗi “403 Forbidden”

Lỗi này xảy ra khi Nginx từ chối truy cập tài nguyên được yêu cầu, do quyền truy cập tệp hoặc thư mục không đúng hoặc người dùng Nginx không có quyền cần thiết.

Giải pháp: Đảm bảo người dùng Nginx có quyền đúng để truy cập nội dung. Chạy lệnh chown -R www-data:www-data /var/www/html để chuyển quyền sở hữu thư mục /var/www/html sang người dùng Nginx.

2. Lỗi “502 Bad Gateway”

Lỗi này xảy ra khi Nginx làm reverse proxy nhưng server backend không phản hồi. Có thể do server backend cấu hình sai hoặc không chạy.

Giải pháp: Kiểm tra trạng thái server backend, đảm bảo nó đang chạy. Nếu server backend chạy, kiểm tra cấu hình Nginx đặc biệt là chỉ thị proxy_pass để đảm bảo cổng đúng.

3. Lỗi “504 Gateway Timeout”

Lỗi xảy ra khi Nginx là reverse proxy nhưng backend phản hồi quá chậm. Do server backend chậm hoặc giá trị timeout trong cấu hình Nginx quá thấp.

Giải pháp: Tăng các giá trị timeout trong file cấu hình Nginx, ví dụ thêm các dòng:

proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

Những dòng này tăng timeout lên 300 giây.

Hiểu nguyên nhân và áp dụng các giải pháp này giúp bạn khắc phục nhanh các lỗi Nginx.


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

Nginx dùng để làm gì?

Nginx là phần mềm máy chủ web mã nguồn mở phổ biến, dùng cho nhiều mục đích như:

  • Phục vụ nội dung tĩnh (HTML, CSS, hình ảnh...)
  • Làm reverse proxy phân phối lưu lượng tới nhiều máy chủ backend
  • Cân bằng tải lưu lượng giữa các máy chủ
  • Xử lý SSL cho HTTPS
  • Viết lại URL và chuyển hướng

Làm thế nào để cài đặt Nginx trên Ubuntu?

Một số bước:

  1. Cập nhật danh sách gói: sudo apt update
  2. Cài Nginx: sudo apt install nginx
  3. Khởi động Nginx: sudo service nginx start

Làm thế nào để khởi động và bật Nginx?

Khởi động bằng:sudo service nginx start

Bật tự động khởi động với lệnh: sudo systemctl enable nginx

Làm thế nào kiểm tra Nginx đang chạy?

Sử dụng lệnh:

sudo service nginx status

Lệnh này sẽ hiển thị trạng thái hiện tại của dịch vụ, nếu đang chạy sẽ thấy thông báo active và running.

Làm thế nào bảo mật Nginx với SSL?

Để bảo mật, cần lấy chứng chỉ SSL và cấu hình Nginx sử dụng nó. Ví dụ:

  • Lấy chứng chỉ từ CA hoặc tự ký (self-signed) cho thử nghiệm.
  • Tạo server block mới trong cấu hình Nginx, ví dụ trong /etc/nginx/sites-available/default:
server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/certificate.key;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}
  • Khởi động lại Nginx với sudo service nginx restart để áp dụng.

Chúc các bạn thành công!

Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly
Chia sẻ

0 câu trả lời