---
title: "Hướng dẫn cài đặt và quản lý Nginx trên Ubuntu"
description: "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."
url: https://cloudfly.vn/huong-dan-cai-dat-va-quan-ly-nginx-tren-ubuntu
image: https://media.cloudfly.vn/posts/huong-dan-cai-dat-va-quan-li-nginx-tran-ubuntu.png
---

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

![description image](https://media.cloudfly.vn/posts/huong-dan-cai-dat-va-quan-li-nginx-tran-ubuntu.png)
[Nginx](https://www.nginx.com/) 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ũ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. 
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`:

```bash
$ 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:

```bash
$ 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:

```bash
$ sudo ufw allow 'Nginx HTTP'
```

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

```bash
$ 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:

```bash
$ 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](http://icanhazip.com) để lấy địa chỉ IP công cộng:

```bash
$ 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:

```bash
$ sudo systemctl stop nginx
```

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

```bash
$ sudo systemctl start nginx
```

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

```bash
$ 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:

```bash
$ 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:

```bash
$ sudo systemctl disable nginx
```

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

```bash
$ 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:

```bash
$ 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`:

```bash
$ 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:

```bash
$ 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:

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

Thêm HTML mẫu sau:

```html
<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`:

```bash
$ 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:

```nginx
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 `root` và `server_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:

```bash
$ 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ị `listen` và `server_name`:

- `your_domain`: phản hồi cho các yêu cầu với `your_domain` và `www.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:

```bash
$ 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:

```bash
$ sudo nginx -t
```

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

```bash
$ sudo systemctl restart nginx
```


###  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:

```nginx
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:

```nginx
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](https://www.f5.com/go/product/welcome-to-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:

```bash
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`:

```nginx
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!
