Nginx là một trong những máy chủ web phổ biến nhất trên thế giới, được sử dụng để vận hành nhiều trang web có lưu lượng truy cập lớn nhất hiện nay. Đây là giải pháp nhẹ, linh hoạt, có thể đóng vai trò máy chủ web hoặc reverse proxy.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách cài đặt Nginx trên Ubuntu 22.04, cấu hình tường lửa, quản lý tiến trình, và thiết lập server blocks để lưu trữ nhiều tên miền trên cùng một máy chủ.
Yêu cầu trước khi bắt đầu
Trước khi bắt đầu, bạn cần có một tài khoản người dùng thông thường (không phải root) với quyền sudo
trên máy chủ.
Ngoài ra, bạn có thể đăng ký tên miền trước khi thực hiện các bước cuối cùng trong hướng dẫn này.
Khi đã sẵn sàng, hãy đăng nhập vào máy chủ bằng tài khoản 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 repo mặc định của Ubuntu, bạn có thể cài đặt nó bằng hệ thống quản lý gói apt
.
Vì đây là lần đầu tiên chúng ta tương tác với hệ thống quản lý 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ó được 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
Khi được yêu cầu xác nhận cài đặt, hãy nhấn Y
. Nếu được yêu cầu khởi động lại một số dịch vụ, nhấn ENTER
để chấp nhận cấu hình mặc định và tiếp tục. apt
sẽ cài đặt Nginx và các phụ thuộc cần thiết vào máy chủ.
Bước 2: Cấu hình tường lửa
Trước khi kiểm tra Nginx, bạn cần cấu hình phần mềm tường lửa để cho phép truy cập vào dịch vụ này. Sau khi cài đặt, Nginx sẽ tự đăng ký như một dịch vụ với ufw
, nhờ đó việc cho phép Nginx truy cập qua tường lửa sẽ đơn giản hơn.
Hãy liệt kê các cấu hình ứng dụng mà ufw
nhận diện được bằng lệnh sau:
sudo ufw app list
Bạn sẽ thấy kết quả như sau:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Trong phần kết quả, có ba profile khả dụng cho Nginx:
- Nginx Full: Mở cổng 80 (HTTP không mã hóa) và cổng 443 (HTTPS mã hóa SSL/TLS)
- Nginx HTTP: Chỉ mở cổng 80
- Nginx HTTPS: Chỉ mở cổng 443
Bạn nên sử dụng cấu hình hạn chế nhất mà vẫn đáp ứng nhu cầu truy cập. Trong trường hợp này, chỉ cần cho phép cổng 80:
Bạn có thể bật cấu hình này bằng cách nhập:
sudo ufw allow 'Nginx HTTP'
Xác nhận thay đổi bằng:
sudo ufw status
Kết quả xuất ra sẽ cho biết loại lưu lượng HTTP nào được 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
Kết thúc quá trình cài đặt, Ubuntu 22.04 sẽ khởi động Nginx. Máy chủ web lúc này sẽ được kích hoạt và chạy.
Chúng ta có thể dùng hệ thống init systemd
để kiểm tra xem dịch vụ có đang chạy hay không bằng cách nhập:
systemctl status nginx
Kết quả mẫu:
● 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 2022-03-01 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
Như đã xác nhận, dịch vụ đã khởi động thành công. Tuy nhiên, cách chắc chắn nhất để kiểm tra là gửi yêu cầu thực tế đến một trang do Nginx phục vụ.
Bạn có thể truy cập trang mặc định của Nginx để xác nhận phần mềm đang hoạt động bình thường bằng cách mở địa chỉ IP của máy chủ trong trình duyệt. Nếu chưa biết địa chỉ IP, bạn có thể sử dụng công cụ icanhazip.com để tra cứu. Công cụ này sẽ trả về địa chỉ IP công khai của máy chủ từ một vị trí khác trên Internet.
curl -4 icanhazip.com
Khi đã có địa chỉ IP của máy chủ, hãy nhập nó vào thanh địa chỉ của trình duyệt:
http://your_server_ip
Bạn sẽ thấy trang chào mừng mặc định của Nginx:
Trang này cho thấy máy chủ đã có thể vận hành và quản lý.
Bước 4: Quản lý tiến trình Nginx
Bây giờ khi máy chủ web của bạn đã hoạt động, hãy xem qua một số lệnh quản lý cơ bản.
Để dừng máy chủ web, gõ:
sudo systemctl stop nginx
Để khởi động lại máy chủ web khi đang dừng, nhập:
sudo systemctl start nginx
Để dừng và khởi động lại dịch vụ, nhập:
sudo systemctl restart nginx
Nếu bạn chỉ thay đổi cấu hình mà không cần dừng dịch vụ, Nginx thường có thể tải lại mà không ngắt kết nối hiện tại. Thực hiện bằng cách nhập:
sudo systemctl reload nginx
Theo cấu hình mặc định, Nginx luôn tự khởi động cùng hệ thống. Nếu không muốn, bạn có thể vô hiệu hóa bằng lệnh:
sudo systemctl disable nginx
Để kích hoạt lại chế độ khởi động cùng hệ thống, bạn có thể dùng lệnh:
sudo systemctl enable nginx
Bạn đã nắm được các lệnh quản lý cơ bản và có thể tiến hành cấu hình để máy chủ phục vụ nhiều tên miền cùng lúc.
Bước 5: Thiết lập Server Block (Khuyến nghị)
Khi sử dụng máy chủ web Nginx, server block (tương tự như virtual host trong Apache) cho phép tách biệt cấu hình và phục vụ nhiều tên miền trên cùng một máy chủ.
Trong ví dụ này, chúng ta sẽ cấu hình cho tên miền giả định your_domain
. Khi triển khai thực tế, bạn cần thay thế bằng tên miền của mình.
Trên Ubuntu 22.04, Nginx được cài đặt kèm một server block mặc định, phục vụ nội dung từ thư mục /var/www/html
. Cấu hình này thích hợp cho một website duy nhất, nhưng sẽ khó quản lý khi cần lưu trữ nhiều website.
Thay vì chỉnh sửa trực tiếp /var/www/html
, chúng ta sẽ tạo một thư mục riêng cho your_domain
bên trong /var/www
, đồng thời giữ nguyên /var/www/html
làm thư mục mặc định (chỉ phục vụ khi yêu cầu của client không khớp với bất kỳ tên miền nào khác).
Tạo thư mục cho your_domain
như sau, sử dụng cờ -p
để tạo cả các thư mục cha cần thiết:
sudo mkdir -p /var/www/your_domain/html
Tiếp theo, gán quyền sở hữu thư mục cho người dùng hiện tại bằng biến môi trường $USER
:
sudo chown -R $USER:$USER /var/www/your_domain/html
Quyền của thư mục gốc web sẽ ở trạng thái đúng nếu bạn chưa thay đổi giá trị umask
, giá trị này đặt quyền mặc định cho tệp.
Để đảm bảo quyền được thiết lập đúng, cho phép chủ sở hữu đọc, ghi và thực thi tệp, còn nhóm và những người khác chỉ có quyền đọc và thực thi, bạn có thể nhập lệnh sau:
sudo chmod -R 755 /var/www/your_domain
Tiếp theo, tạo một trang index.html
mẫu bằng nano
hoặc trình soạn thảo mà bạn ưa thích:
nano /var/www/your_domain/html/index.html
Bên trong, thêm đoạn HTML mẫu như 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 tệp bằng cách nhấn Ctrl+X
để thoát, sau đó khi được hỏi lưu, nhấn Y
và rồi Enter
.
Để Nginx có thể phục vụ nội dung này, cần tạo một server block với các chỉ thị tương ứng. Thay vì chỉnh sửa trực tiếp tệp cấu hình mặc định, hãy tạo một tệp mới tại /etc/nginx/sites-available/your_domain
:
sudo nano /etc/nginx/sites-available/your_domain
Dán khối cấu hình dưới đây vào tệp. Khối cấu hình này tương tự như cấu hình mặc định, nhưng đã được điều chỉnh phù hợp với thư mục và tên miền mới của chúng ta.
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;
}
}
Lưu ý, chúng ta đã cập nhật cấu hình root
thành thư mục mới và server_name
thành tên miền của bạn. Tiếp theo, bạn cần kích hoạt tệp cấu hình bằng cách tạo liên kết từ tệp này đến thư mục sites-enabled
, nơi Nginx sẽ đọc khi khởi động:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Lưu ý: Nginx sử dụng một phương pháp phổ biến gọi là symbolic links (liên kết tượng trưng hay symlinks) để quản lý các server block đang được kích hoạt. Việc tạo symlink giống như tạo một phím tắt trên ổ đĩa, vì thế bạn có thể xóa phím tắt trong thư mục sites-enabled
mà vẫn giữ nguyên server block trong sites-available
nếu muốn kích hoạt lại sau này.
Hiện tại có hai server block được kích hoạt và cấu hình để phản hồi các yêu cầu dựa trên các chỉ thị listen
và server_name
(bạn có thể đọc thêm về cách Nginx xử lý các chỉ thị này tại đây):
your_domain
: sẽ phản hồi các yêu cầu tớiyour_domain
vàwww.your_domain
.default
: sẽ phản hồi các yêu cầu trên cổng 80 mà không khớp với hai block trên.
Để tránh lỗi bộ nhớ hash bucket có thể phát sinh khi thêm các tên server, bạn cần điều chỉnh một giá trị trong file /etc/nginx/nginx.conf
. Mở file này ra:
sudo nano /etc/nginx/nginx.conf
Tìm chỉ thị server_names_hash_bucket_size
và bỏ dấu #
ở đầu dòng để bỏ chú thích dòng này. Nếu bạn dùng nano
, bạn có thể tìm kiếm nhanh bằng cách nhấn tổ hợp phím CTRL + W
rồi nhập từ khóa cần tìm.
Lưu ý: Việc chú thích dòng mã bằng cách đặt dấu #
ở đầu dòng là phương pháp để vô hiệu hóa chúng mà không cần xóa bỏ hoàn toàn. Nhiều tệp cấu hình thường có sẵn các tùy chọn được chú thích, giúp bạn dễ dàng bật hoặc tắt bằng cách chuyển đổi giữa trạng thái mã lệnh hoạt động và phần chú thích.
/etc/nginx/nginx.conf
...
http {
...
server_names_hash_bucket_size 64;
...
}
...
Lưu và đóng file khi bạn hoàn tất.
Tiếp theo, kiểm tra để đảm bảo không có lỗi cú pháp nào trong các file cấu hình Nginx bằng lệnh sau:
sudo nginx -t
Nếu không có vấn đề gì, bạn có thể khởi động lại Nginx để áp dụng các thay đổi của mình:
sudo systemctl restart nginx
Giờ thì Nginx đã bắt đầu phục vụ tên miền của bạn. Bạn có thể kiểm tra bằng cách truy cập vào địa chỉ http\\://your\\_domain
, tại đó bạn sẽ thấy giao diện tương tự như sau:
Bước 6: Làm quen với các tệp và thư mục quan trọng của Nginx
Sau khi đã nắm được cách quản lý dịch vụ Nginx, bạn nên dành vài phút để làm quen với các thư mục và tệp cấu hình quan trọng sau.
- Nội dung
/var/www/html
: Nội dung web thực tế, mặc định chỉ gồm trang Nginx mặc định mà bạn đã thấy trước đó, được phục vụ từ thư mục/var/www/html
. Bạn có thể thay đổi bằng cách chỉnh sửa các file cấu hình của Nginx.
- Cấu hình máy chủ
/etc/nginx
: Thư mục cấu hình của Nginx. Tất cả các file cấu hình của Nginx đều nằm ở đây./etc/nginx/nginx.conf
: File cấu hình chính của Nginx. File này có thể được chỉnh sửa để thay đổi cấu hình toàn cục của Nginx./etc/nginx/sites-available/
: Thư mục nơi lưu trữ các server block theo từng site. Nginx sẽ không sử dụng các file cấu hình trong thư mục này trừ khi chúng được liên kết tới thư mụcsites-enabled
. Thông thường, tất cả cấu hình server block được thực hiện trong thư mục này, rồi được kích hoạt bằng cách tạo liên kết tới thư mục kia./etc/nginx/sites-enabled/
: Thư mục lưu trữ các server block theo từng site đã được kích hoạt. Thông thường, các file này được tạo ra bằng cách liên kết tới các file cấu hình trong thư mụcsites-available
./etc/nginx/snippets
: Thư mục chứa các đoạn cấu hình có thể được chèn vào các vị trí khác trong cấu hình Nginx. Những đoạn cấu hình có thể tái sử dụng là lựa chọn tốt để được tái cấu trúc thành các snippet.
- Nhật ký máy chủ
/var/log/nginx/access.log
: Mỗi yêu cầu tới máy chủ web của bạn sẽ được ghi lại trong file nhật ký này, trừ khi Nginx được cấu hình khác./var/log/nginx/error.log
: Bất kỳ lỗi nào của Nginx sẽ được ghi lại trong file nhật ký này.
Kết luận
Đến đây, bạn đã hoàn tất việc cài đặt máy chủ web và có thể thoải mái lựa chọn loại nội dung cũng như các công nghệ muốn tích hợp, nhằm mang lại trải nghiệm đa dạng và phong phú hơn cho người dùng.
- Nếu bạn muốn xây dựng một ngăn xếp ứng dụng hoàn chỉnh, hãy tham khảo bài viết:Hướng dẫn cài đặt Linux, Nginx, MySQL, PHP (gọi tắt là LEMP stack) trên Ubuntu 22.04.
-
Nếu bạn muốn thiết lập HTTPS cho tên miền của mình bằng chứng chỉ SSL miễn phí từ Let’s Encrypt, hãy tiếp tục với bài viết:
Hướng dẫn bảo mật Nginx bằng Let’s Encrypt trên Ubuntu 22.04.