Hướng Dẫn Chi Tiết: Cài Đặt và Cấu Hình Nginx trên Ubuntu Server
Chào mừng bạn đến với hướng dẫn chi tiết về cách cài đặt và cấu hình Nginx trên hệ điều hành Ubuntu. Nginx là một trong những web server, reverse proxy, và load balancer phổ biến nhất hiện nay, được biết đến với hiệu suất cao, khả năng sử dụng ít tài nguyên và độ tin cậy vượt trội.
Giới Thiệu
Nginx (phát âm là "engine-x") là một phần mềm mã nguồn mở mạnh mẽ, được thiết kế để xử lý lượng lớn truy cập đồng thời một cách hiệu quả. Ban đầu được tạo ra để phục vụ các trang web tĩnh và proxy ngược (reverse proxy), Nginx đã phát triển thành một giải pháp toàn diện cho nhiều tác vụ liên quan đến mạng và web.
Tại sao sử dụng Nginx?
- Hiệu suất cao: Nginx được xây dựng trên kiến trúc không đồng bộ, xử lý hàng ngàn kết nối đồng thời với hiệu suất tối ưu và ít tài nguyên hơn so với các web server truyền thống.
- Tính ổn định và tin cậy: Với kiến trúc tối ưu, Nginx rất ổn định ngay cả dưới tải trọng cao.
- Đa năng: Ngoài vai trò web server, Nginx còn là một reverse proxy, load balancer, HTTP cache và có thể xử lý SSL/TLS termination.
- Dễ cấu hình: Mặc dù mạnh mẽ, cấu hình của Nginx rất trực quan và dễ hiểu.
Các trường hợp sử dụng phổ biến:
- Phục vụ trang web tĩnh và động (kết hợp với PHP-FPM, Gunicorn, Node.js).
- Làm reverse proxy cho các ứng dụng backend (API, microservices).
- Cân bằng tải (load balancing) để phân phối lưu lượng truy cập qua nhiều server.
- SSL/TLS termination để mã hóa và giải mã lưu lượng truy cập.
Metadata:
- Thời gian thực hiện: Khoảng 15-30 phút
- Độ khó: Dễ - Trung bình
- Yêu cầu: Quyền truy cập
sudotrên một máy chủ Ubuntu đang hoạt động, kết nối Internet.
Yêu Cầu Hệ Thống
Để cài đặt và chạy Nginx một cách hiệu quả, máy chủ của bạn cần đáp ứng các yêu cầu sau:
Cấu hình tối thiểu:
- Hệ điều hành: Ubuntu 20.04 LTS (hoặc phiên bản mới hơn)
- RAM: 512 MB
- CPU: 1 lõi (core)
- Dung lượng đĩa trống: 5 GB
Cấu hình khuyến nghị:
- Hệ điều hành: Ubuntu 22.04 LTS (hoặc phiên bản mới nhất)
- RAM: 1 GB trở lên
- CPU: 2 lõi (core) trở lên
- Dung lượng đĩa trống: 10 GB trở lên
Các Bước Thực Hiện Chi Tiết
Hãy bắt đầu quá trình cài đặt Nginx trên máy chủ Ubuntu của bạn!
Bước 1: Cập nhật Hệ thống 🌐
Trước khi cài đặt bất kỳ phần mềm nào, điều quan trọng là phải cập nhật danh sách gói và nâng cấp các gói hiện có trên hệ thống của bạn. Điều này đảm bảo bạn đang làm việc với các phiên bản phần mềm mới nhất và khắc phục các lỗ hổng bảo mật tiềm ẩn.
# Cập nhật danh sách các gói có sẵn từ các kho lưu trữ
sudo apt update
# Nâng cấp tất cả các gói đã cài đặt lên phiên bản mới nhất
# Tùy chọn -y sẽ tự động xác nhận các lời nhắc mà không cần bạn phải nhập 'y'
sudo apt upgrade -y
💡 Tip: Việc cập nhật hệ thống thường xuyên là một thói quen tốt để duy trì tính bảo mật và ổn định cho server của bạn.
Bước 2: Cài đặt Nginx ⚙️
Nginx có sẵn trong kho lưu trữ mặc định của Ubuntu, giúp việc cài đặt trở nên đơn giản.
# Cài đặt gói Nginx
# Lệnh này sẽ tải xuống và cài đặt Nginx cùng với các phần phụ thuộc cần thiết.
sudo apt install nginx -y
Sau khi quá trình cài đặt hoàn tất, dịch vụ Nginx sẽ tự động khởi động.
Bước 3: Điều chỉnh Firewall (UFW) 🔒
Ubuntu sử dụng UFW (Uncomplicated Firewall) làm công cụ tường lửa mặc định. Để Nginx có thể phục vụ các trang web, bạn cần cho phép lưu lượng truy cập HTTP (cổng 80) và/hoặc HTTPS (cổng 443) đi qua tường lửa.
Đầu tiên, kiểm tra trạng thái của UFW:
# Kiểm tra trạng thái của UFW
sudo ufw status
Nếu UFW đang hoạt động, bạn sẽ thấy trạng thái "Status: active". Nếu không, bạn có thể thấy "Status: inactive".
Nginx đăng ký một số cấu hình ứng dụng với UFW khi cài đặt:
- Nginx HTTP: Chỉ mở cổng 80 (lưu lượng HTTP không mã hóa).
- Nginx HTTPS: Chỉ mở cổng 443 (lưu lượng HTTPS được mã hóa).
- Nginx Full: Mở cả cổng 80 và 443.
Bạn nên chọn cấu hình phù hợp với nhu cầu của mình. Trong hầu hết các trường hợp, bạn sẽ muốn cho phép cả HTTP và HTTPS, hoặc ít nhất là HTTP để kiểm tra ban đầu.
# Cho phép lưu lượng truy cập HTTP (cổng 80)
# Nếu bạn chỉ muốn cho phép HTTP, sử dụng lệnh này.
sudo ufw allow 'Nginx HTTP'
# Hoặc, nếu bạn muốn cho phép cả HTTP và HTTPS (khuyên dùng cho môi trường production)
# sudo ufw allow 'Nginx Full'
# Sau khi cho phép Nginx, nếu UFW chưa được bật, hãy bật nó.
# Cảnh báo quan trọng: Khi bật UFW, hãy đảm bảo bạn đã cho phập cổng SSH (mặc định là 22)
# Nếu không, bạn có thể mất quyền truy cập vào server qua SSH.
# Ví dụ: sudo ufw allow OpenSSH
# Sau đó:
# sudo ufw enable
# Nhập 'y' khi được hỏi xác nhận.
Kiểm tra lại trạng thái UFW để xác nhận các quy tắc đã được áp dụng:
# Kiểm tra lại trạng thái UFW để đảm bảo các quy tắc đã được thêm
sudo ufw status
Bạn sẽ thấy các quy tắc cho Nginx được liệt kê.
Bước 4: Kiểm tra trạng thái Nginx ✅
Sau khi cài đặt và cấu hình tường lửa, hãy kiểm tra xem Nginx có đang chạy đúng cách hay không.
# Kiểm tra trạng thái của dịch vụ Nginx
sudo systemctl status nginx
Bạn sẽ thấy một đầu ra tương tự như sau, cho biết Nginx đang hoạt động (active) và chạy (running):
● 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 ...
Docs: man:nginx(8)
Process: 1234 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 1235 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
Main PID: 1236 (nginx)
Tasks: 2 (limit: 1137)
Memory: 2.9M
CPU: 43ms
CGroup: /system.slice/nginx.service
├─1236 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─1237 "nginx: worker process"
Nếu Nginx không chạy, bạn có thể khởi động nó bằng lệnh:
# Khởi động dịch vụ Nginx
sudo systemctl start nginx
Để đảm bảo Nginx tự động khởi động cùng hệ thống mỗi khi server khởi động lại:
# Kích hoạt Nginx để tự động khởi động cùng hệ thống
sudo systemctl enable nginx
Bây giờ, hãy xác minh Nginx hoạt động bằng cách truy cập địa chỉ IP công khai của server của bạn trên trình duyệt web. Bạn có thể tìm địa chỉ IP công khai của server bằng nhiều cách, ví dụ:
# Lấy địa chỉ IP công khai của server
curl -4 icanhazip.com
Hoặc, nếu bạn đang truy cập từ bên trong server:
# Lấy địa chỉ IP nội bộ của server (thường là eth0 hoặc ensX)
ip a
Sau khi có địa chỉ IP, hãy mở trình duyệt và nhập http://YOUR_SERVER_IP. Bạn sẽ thấy trang chào mừng mặc định của Nginx trên Ubuntu:
"Welcome to nginx!"
Điều này xác nhận rằng Nginx đã được cài đặt và cấu hình thành công.
Bước 5: Quản lý Dịch vụ Nginx ⚙️
Bạn có thể sử dụng systemctl để quản lý dịch vụ Nginx:
# Dừng dịch vụ Nginx
sudo systemctl stop nginx
# Khởi động dịch vụ Nginx
sudo systemctl start nginx
# Khởi động lại dịch vụ Nginx (dừng và sau đó khởi động lại)
sudo systemctl restart nginx
# Tải lại cấu hình Nginx mà không làm gián đoạn các kết nối hiện có
# Nên sử dụng lệnh này sau khi thay đổi cấu hình Nginx
sudo systemctl reload nginx
# Vô hiệu hóa Nginx (ngăn không cho nó khởi động cùng hệ thống)
sudo systemctl disable nginx
# Kích hoạt Nginx (đảm bảo nó khởi động cùng hệ thống)
sudo systemctl enable nginx
Bước 6: Cấu hình Cơ bản Nginx (Server Blocks) 📝
Nginx sử dụng các "server blocks" (tương tự như Virtual Hosts trong Apache) để quản lý nhiều trang web trên một server duy nhất.
Các thư mục cấu hình quan trọng:
/etc/nginx/: Thư mục chứa tất cả các file cấu hình Nginx./etc/nginx/nginx.conf: File cấu hình chính của Nginx./etc/nginx/sites-available/: Thư mục chứa các file cấu hình server block (có thể có nhiều file cho nhiều trang web)./etc/nginx/sites-enabled/: Thư mục chứa các liên kết tượng trưng (symlinks) đến các server block trongsites-availablemà bạn muốn kích hoạt. Nginx chỉ đọc các file cấu hình trong thư mục này.
Tạo Server Block mới:
Hãy tạo một server block đơn giản để phục vụ một trang web mẫu. Thay thế your_domain bằng tên miền thực tế của bạn hoặc địa chỉ IP của server.
-
Tạo thư mục gốc cho website: Đây là nơi chứa các file của trang web của bạn.
# Tạo thư mục cho tên miền của bạn. Ví dụ: /var/www/example.com/html
# Tùy chọn -p đảm bảo rằng tất cả các thư mục cha mẹ cũng được tạo nếu chúng chưa tồn tại.
sudo mkdir -p /var/www/your_domain/html -
Tạo một file
index.htmlmẫu: Chúng ta sẽ tạo một file HTML đơn giản để kiểm tra.# Tạo một file index.html mẫu với nội dung đơn giản
echo "`<h1>`Chào mừng đến với Trang Web của bạn trên Nginx!</h1>" | sudo tee /var/www/your_domain/html/index.html -
Gán quyền sở hữu cho thư mục: Đảm bảo rằng Nginx có thể đọc các file trong thư mục này. Thông thường, người dùng
www-datalà người dùng mà Nginx chạy dưới đó. Tuy nhiên, để dễ dàng quản lý, bạn có thể gán quyền sở hữu cho người dùng hiện tại của bạn và sau đó điều chỉnh quyền truy cập.# Gán quyền sở hữu cho người dùng hiện tại của bạn cho thư mục web
# $USER là biến môi trường chứa tên người dùng hiện tại của bạn.
sudo chown -R $USER:$USER /var/www/your_domain/html
# Đặt quyền đọc cho nhóm và người khác để Nginx có thể truy cập
sudo chmod -R 755 /var/www/your_domain -
Tạo file cấu hình Server Block mới: Sử dụng trình soạn thảo văn bản như
nanođể tạo file cấu hình cho tên miền của bạn.# Mở một file cấu hình mới trong thư mục sites-available
sudo nano /etc/nginx/sites-available/your_domainDán nội dung sau vào file, thay thế
your_domainbằng tên miền của bạn:# Khối server định nghĩa một Virtual Host cho Nginx.
server {
# Lắng nghe trên cổng 80 (HTTP) cho cả IPv4 và IPv6
listen 80;
listen [::]:80;
# Thư mục gốc chứa các file của trang web này
root /var/www/your_domain/html;
# Các file index mặc định mà Nginx sẽ tìm kiếm khi truy cập thư mục
index index.html index.htm index.nginx-debian.html;
# Tên miền (hoặc địa chỉ IP) mà server block này sẽ phản hồi
# Thay thế your_domain và www.your_domain bằng tên miền thực tế của bạn.
# Nếu bạn không có tên miền, bạn có thể sử dụng địa chỉ IP công khai của server.
server_name your_domain www.your_domain;
# Khối location định nghĩa cách Nginx xử lý các yêu cầu cho các URL cụ thể.
# Ở đây, nó xử lý tất cả các yêu cầu ('/')
location / {
# try_files cố gắng phục vụ các file hoặc thư mục theo thứ tự.
# $uri: Cố gắng phục vụ file khớp với URI yêu cầu.
# $uri/: Cố gắng phục vụ thư mục khớp với URI yêu cầu (và tìm file index).
# =404: Nếu không tìm thấy gì, trả về lỗi 404.
try_files $uri $uri/ =404;
}
# Khối này là một ví dụ về cách xử lý lỗi 404 tùy chỉnh
# error_page 404 /404.html;
# location = /404.html {
# internal;
# }
# Khối này là một ví dụ về cách xử lý lỗi 500, 502, 503, 504 tùy chỉnh
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root /usr/share/nginx/html;
# }
}Lưu và đóng file (Ctrl+X, Y, Enter với nano).
-
Kích hoạt Server Block: Tạo một liên kết tượng trưng (symlink) từ file cấu hình trong
sites-availablesangsites-enabled.# Tạo symlink từ sites-available sang sites-enabled để kích hoạt server block
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/💡 Tip: Nếu bạn không cần trang mặc định của Nginx, bạn có thể xóa symlink của nó để tránh xung đột hoặc chỉ đơn giản là để server của bạn chỉ phục vụ trang của bạn.
# Xóa symlink của trang mặc định nếu bạn không cần nó
sudo rm /etc/nginx/sites-enabled/default -
Kiểm tra lỗi cấu hình Nginx: Trước khi khởi động lại Nginx, luôn kiểm tra cú pháp cấu hình để tránh gây ra lỗi không mong muốn.
# Kiểm tra cú pháp cấu hình Nginx
sudo nginx -tNếu không có lỗi, bạn sẽ thấy thông báo:
nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful -
Khởi động lại Nginx: Áp dụng các thay đổi cấu hình bằng cách khởi động lại Nginx.
# Khởi động lại Nginx để áp dụng cấu hình mới
sudo systemctl restart nginx
Bây giờ, nếu bạn đã cấu hình DNS cho your_domain để trỏ đến địa chỉ IP của server, bạn có thể truy cập http://your_domain trên trình duyệt và sẽ thấy nội dung của file index.html mà bạn đã tạo. Nếu chưa có tên miền, bạn vẫn có thể truy cập bằng địa chỉ IP công khai của server.
Troubleshooting hoặc Các Vấn Đề Thường Gặp
Khi làm việc với Nginx, bạn có thể gặp một số vấn đề. Dưới đây là các lỗi phổ biến và cách khắc phục:
-
Nginx không khởi động hoặc không tải lại cấu hình:
- Nguyên nhân: Thường là do lỗi cú pháp trong file cấu hình.
- Khắc phục:
- Sử dụng lệnh kiểm tra cấu hình:
sudo nginx -t. Lệnh này sẽ chỉ ra dòng và file bị lỗi. - Kiểm tra nhật ký lỗi của Nginx:
sudo journalctl -xe | grep nginxhoặcsudo tail -f /var/log/nginx/error.log.
- Sử dụng lệnh kiểm tra cấu hình:
-
Trang web không hiển thị hoặc hiển thị trang mặc định của Nginx:
- Nguyên nhân:
- Firewall chặn truy cập.
server_nametrong cấu hình server block không khớp với tên miền được yêu cầu.- Symlink đến server block của bạn chưa được tạo hoặc file
defaultvẫn còn trongsites-enabledvà đang được ưu tiên.
- Khắc phục:
- Kiểm tra lại cấu hình UFW (
sudo ufw status). - Đảm bảo
server_namechính xác trong file cấu hình (/etc/nginx/sites-available/your_domain). - Kiểm tra thư mục
/etc/nginx/sites-enabled/để đảm bảo symlink của bạn tồn tại và không có symlinkdefaultnếu bạn không muốn nó.
- Kiểm tra lại cấu hình UFW (
- Nguyên nhân:
-
Lỗi 403 Forbidden:
- Nguyên nhân: Nginx không có quyền đọc các file hoặc thư mục của trang web.
- Khắc phục:
- Kiểm tra quyền sở hữu và quyền truy cập của thư mục gốc trang web (
/var/www/your_domain/html). Đảm bảo Nginx (người dùngwww-data) có quyền đọc. sudo chown -R www-data:www-data /var/www/your_domainsudo chmod -R 755 /var/www/your_domain
- Kiểm tra quyền sở hữu và quyền truy cập của thư mục gốc trang web (
-
Lỗi 502 Bad Gateway:
- Nguyên nhân: Nginx đang hoạt động như một reverse proxy và không thể kết nối với dịch vụ backend (ví dụ: PHP-FPM, Node.js app, Gunicorn) mà nó đang cố gắng proxy đến. Backend có thể không chạy hoặc cấu hình proxy trong Nginx bị sai.
- Khắc phục:
- Kiểm tra trạng thái của dịch vụ backend (ví dụ:
sudo systemctl status php8.1-fpm). - Kiểm tra cấu hình proxy trong Nginx của bạn, đặc biệt là các directive
proxy_pass.
- Kiểm tra trạng thái của dịch vụ backend (ví dụ:
-
Nginx không thể lắng nghe trên cổng 80/443 (Port already in use):
- Nguyên nhân: Một tiến trình khác đang sử dụng cổng mà Nginx cố gắng lắng nghe.
- Khắc phục:
- Tìm tiến trình đang chiếm cổng:
sudo lsof -i :80(thay 80 bằng 443 nếu cần). - Dừng tiến trình đó hoặc thay đổi cổng Nginx lắng nghe nếu cần.
- Tìm tiến trình đang chiếm cổng:
Kết Luận
Chúc mừng! Bạn đã hoàn tất quá trình cài đặt và cấu hình cơ bản Nginx trên Ubuntu. Bạn đã học cách:
- Cập nhật hệ thống và cài đặt Nginx.
- Cấu hình tường lửa UFW để cho phép lưu lượng truy cập đến Nginx.
- Kiểm tra trạng thái và quản lý dịch vụ Nginx.
- Tạo và kích hoạt một Server Block cơ bản để phục vụ trang web của riêng bạn.
Nginx là một công cụ cực kỳ mạnh mẽ và linh hoạt. Việc làm quen với các khái niệm cơ bản này sẽ mở ra cánh cửa cho bạn để khám phá các tính năng nâng cao hơn.
Best Practices:
- Bảo mật SSL/TLS: Luôn triển khai chứng chỉ SSL/TLS (ví dụ: Let's Encrypt) để mã hóa lưu lượng truy cập giữa người dùng và server của bạn.
- Tối ưu hiệu suất: Cấu hình caching, nén Gzip, và điều chỉnh các worker process để tối ưu hóa hiệu suất của Nginx.
- Quản lý log: Theo dõi các file log
/var/log/nginx/access.logvà/var/log/nginx/error.logthường xuyên để phát hiện và khắc phục sự cố. - Cập nhật thường xuyên: Giữ Nginx và hệ điều hành Ubuntu của bạn được cập nhật để tận dụng các bản vá bảo mật và cải tiến hiệu suất mới nhất.
- Sử dụng tên miền: Mặc dù bạn có thể sử dụng IP, việc sử dụng tên miền sẽ chuyên nghiệp hơn và cần thiết cho SSL/TLS.
Tài liệu tham khảo:
- Trang chủ Nginx: https://nginx.org/
- Tài liệu Ubuntu Server: https://ubuntu.com/server/docs
- Hướng dẫn cài đặt Nginx trên DigitalOcean: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-22-04 (Tham khảo để tìm hiểu thêm)
Chúc bạn thành công trên hành trình phát triển và quản lý web server của mình!