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.
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.
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.
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:
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)
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â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.
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 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:
$ 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 trongsites-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:
$ 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ự:
Ở 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.
/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./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./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.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.
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;
}
}
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.
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.
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.
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.
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ư:
Một số bước:
sudo apt update
sudo apt install nginx
sudo service nginx start
Khởi động bằng:sudo service nginx start
Bật tự động khởi động với lệnh: sudo systemctl enable nginx
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.
Để bảo mật, cần lấy chứng chỉ SSL và cấu hình Nginx sử dụng nó. Ví dụ:
/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;
}
}
sudo service nginx restart
để áp dụng.Chúc các bạn thành công!