1. Nginx là gì?
Nginx (phát âm là "engine-x") là một web server mã nguồn mở, mạnh mẽ và hiệu suất cao, được phát triển bởi Igor Sysoev vào năm 2004. Ban đầu được tạo ra để giải quyết vấn đề C10K (xử lý 10,000 kết nối đồng thời), Nginx đã nhanh chóng trở thành một trong những web server phổ biến nhất thế giới.
Nginx không chỉ là web server mà còn có thể hoạt động như:
- Reverse proxy server
- Load balancer
- HTTP cache
- Mail proxy server
- API Gateway
Kiến trúc Event-driven và Non-blocking I/O
Điểm mạnh lớn nhất của Nginx nằm ở kiến trúc của nó. Khác với mô hình truyền thống, Nginx sử dụng kiến trúc event-driven và non-blocking I/O (asynchronous).
Cách hoạt động:
- Master Process: Một tiến trình chính đọc và đánh giá cấu hình, quản lý worker processes
- Worker Processes: Nhiều tiến trình worker xử lý các kết nối thực tế
- Event Loop: Mỗi worker process sử dụng event loop để xử lý hàng nghìn kết nối đồng thời
Non-blocking I/O có nghĩa là:
- Khi một worker process đang chờ I/O (đọc file, database query, network request), nó không bị "block" mà có thể xử lý các request khác
- Một worker process có thể xử lý hàng nghìn kết nối cùng lúc
- Tiết kiệm tài nguyên CPU và RAM đáng kể
Ví dụ minh họa:
Apache (Blocking): Request 1 → Thread 1 → Đợi đọc file (blocked) → Hoàn thành Request 2 → Thread 2 → Đợi đọc file (blocked) → Hoàn thành Request 3 → Thread 3 → Đợi đọc file (blocked) → Hoàn thành → Cần 3 threads cho 3 requests
Nginx (Non-blocking): Request 1 → Worker → Đợi I/O → Xử lý Request 2 → Xử lý Request 3 → Request 1 xong Request 2 → Cùng Worker Request 3 → Cùng Worker → Chỉ cần 1 worker cho 3 requests
2. So sánh Nginx vs Apache
| Tiêu chí | Nginx | Apache |
|---|---|---|
| Kiến trúc | Event-driven, asynchronous | Process/Thread-based |
| Xử lý kết nối | Một worker xử lý nhiều kết nối | Một thread/process cho mỗi kết nối |
| Bộ nhớ | Rất thấp, ổn định | Tăng theo số kết nối |
| Static content | Cực kỳ nhanh | Nhanh nhưng chậm hơn Nginx |
| Dynamic content | Cần kết hợp với backend (PHP-FPM) | Có thể xử lý trực tiếp (mod_php) |
| Cấu hình | Tập trung, file-based | Phân tán (.htaccess) |
| Module | Modules phải compile sẵn | Dynamic loading modules |
| Rewrite rules | Khác biệt, đơn giản hơn | Mạnh mẽ với .htaccess |
| Phù hợp cho | High traffic, static content, reverse proxy | Shared hosting, dynamic content processing |
Khi nào dùng Nginx:
- Serving static files (HTML, CSS, JS, images)
- Reverse proxy cho application servers
- Load balancing
- High concurrency (nhiều kết nối đồng thời)
- Cần performance cao với tài nguyên hạn chế
Khi nào dùng Apache:
- Shared hosting environment
- Cần .htaccess flexibility
- Nhiều dynamic modules
- Legacy applications phụ thuộc vào Apache-specific features
Xu hướng hiện tại: Nhiều hệ thống sử dụng kết hợp: Nginx làm reverse proxy phía trước, Apache xử lý dynamic content phía sau.
3. Cài đặt Nginx
3.1. Cài đặt trên Ubuntu/Debian
Cách 1: Cài từ repository mặc định (đơn giản nhất)
# Update package list sudo apt updateCài đặt Nginx
sudo apt install nginx -y
Kiểm tra version
nginx -v
Kiểm tra trạng thái
sudo systemctl status nginx
Cách 2: Cài từ official Nginx repository (version mới nhất)
# Cài đặt prerequisites sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyringImport official nginx signing key
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/nullSetup repository
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]
http://nginx.org/packages/ubuntulsb_release -csnginx"
| sudo tee /etc/apt/sources.list.d/nginx.listUpdate và cài đặt
sudo apt update sudo apt install nginx -y
3.2. Cài đặt trên CentOS/RHEL
Cách 1: Từ EPEL repository
# CentOS 7 sudo yum install epel-release -y sudo yum install nginx -yCentOS 8 / Rocky Linux / AlmaLinux
sudo dnf install nginx -y
Khởi động và enable
sudo systemctl start nginx sudo systemctl enable nginx
Mở firewall
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
Cách 2: Từ official Nginx repository
# Tạo file repo sudo tee /etc/yum.repos.d/nginx.repo <<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOFCài đặt
sudo yum install nginx -y
3.3. Cài đặt trên macOS
Sử dụng Homebrew:
# Cài đặt Homebrew (nếu chưa có) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Cài Nginx
brew install nginx
Khởi động Nginx
brew services start nginx
Hoặc chạy foreground
nginx
Kiểm tra
nginx -v
Đường dẫn trên macOS:
- Config:
/usr/local/etc/nginx/nginx.conf - Document root:
/usr/local/var/www - Logs:
/usr/local/var/log/nginx
3.4. Cài đặt trên Windows
Bước 1: Download
- Truy cập: http://nginx.org/en/download.html
- Download phiên bản Windows (nginx-x.x.x.zip)
Bước 2: Giải nén và chạy
# Giải nén vào C:\nginxMở Command Prompt với quyền Administrator
cd C:\nginx
Khởi động Nginx
start nginx
Hoặc
nginx.exe
Quản lý Nginx trên Windows:
# Kiểm tra version nginx -vTest cấu hình
nginx -t
Stop
nginx -s stop
Reload
nginx -s reload
Quit gracefully
nginx -s quit
Lưu ý: Trên Windows, Nginx không ổn định bằng trên Linux và không nên dùng cho production.
4. Cấu trúc thư mục và file cấu hình cơ bản
4.1. Cấu trúc thư mục trên Ubuntu/Debian
/etc/nginx/ ├── nginx.conf # File cấu hình chính ├── mime.types # Định nghĩa MIME types ├── fastcgi_params # FastCGI parameters ├── proxy_params # Proxy parameters ├── sites-available/ # Các cấu hình site có sẵn │ └── default # Virtual host mặc định ├── sites-enabled/ # Symlinks đến sites đang active │ └── default -> ../sites-available/default ├── conf.d/ # Additional configurations ├── modules-available/ # Modules có sẵn └── modules-enabled/ # Modules đang enabled/var/log/nginx/ ├── access.log # Access logs └── error.log # Error logs
/var/www/html/ # Document root mặc định └── index.nginx-debian.html
/usr/share/nginx/html/ # Alternative document root
4.2. Cấu trúc trên CentOS/RHEL
/etc/nginx/ ├── nginx.conf # File cấu hình chính ├── mime.types ├── fastcgi_params ├── conf.d/ # Virtual host configs │ └── default.conf └── default.d//var/log/nginx/ ├── access.log └── error.log
/usr/share/nginx/html/ # Document root └── index.html
4.3. File cấu hình nginx.conf cơ bản
# User chạy Nginx user www-data;Số worker processes (thường = số CPU cores)
worker_processes auto;
PID file
pid /run/nginx.pid;
Load dynamic modules
include /etc/nginx/modules-enabled/*.conf;
events { # Số kết nối tối đa mỗi worker worker_connections 768;
# Phương thức event (epoll cho Linux) use epoll;}
http { ## # Basic Settings ## sendfile on; tcp_nopush on; types_hash_max_size 2048;
# MIME types include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
}
4.4. File Virtual Host mẫu
server { # Port lắng nghe listen 80; listen [::]:80;# Domain name server_name example.com www.example.com; # Document root root /var/www/example.com; index index.html index.htm; # Access và error logs access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; # Location block location / { try_files $uri $uri/ =404; } # Deny access to .htaccess location ~ /\.ht { deny all; }
}
5. Khởi động, dừng, reload Nginx
5.1. Quản lý với systemctl (Linux)
# Khởi động Nginx sudo systemctl start nginxDừng Nginx
sudo systemctl stop nginx
Restart Nginx
sudo systemctl restart nginx
Reload cấu hình (không downtime)
sudo systemctl reload nginx
Kiểm tra trạng thái
sudo systemctl status nginx
Enable auto-start khi boot
sudo systemctl enable nginx
Disable auto-start
sudo systemctl disable nginx
5.2. Quản lý với nginx command
# Kiểm tra cấu hình (rất quan trọng trước khi reload) sudo nginx -tTest và show config
sudo nginx -T
Reload cấu hình
sudo nginx -s reload
Stop gracefully (chờ requests hiện tại hoàn thành)
sudo nginx -s quit
Stop ngay lập tức
sudo nginx -s stop
Reopen log files (sau log rotation)
sudo nginx -s reopen
Xem version và compile options
nginx -V
5.3. Sự khác biệt giữa reload, restart, stop
reload:
- Không downtime
- Nginx đọc lại cấu hình
- Worker processes cũ xử lý xong request hiện tại rồi tắt
- Worker processes mới được tạo với cấu hình mới
- Dùng khi: Thay đổi cấu hình, thêm/sửa virtual hosts
sudo nginx -s reloadhoặc
sudo systemctl reload nginx
restart:
- Có downtime (ngắn)
- Stop hoàn toàn rồi start lại
- Tất cả connections bị đứt
- Dùng khi: Cài đặt module mới, thay đổi lớn
sudo systemctl restart nginx
stop vs quit:
# Stop ngay (kill connections) sudo nginx -s stopQuit gracefully (chờ requests hoàn thành)
sudo nginx -s quit
5.4. Kiểm tra Nginx đang chạy
# Kiểm tra process ps aux | grep nginxKiểm tra port đang listen
sudo netstat -tulpn | grep nginx
hoặc
sudo ss -tulpn | grep nginx
Kiểm tra version
nginx -v
Test truy cập
curl http://localhost
hoặc
curl -I http://localhost
5.5. Troubleshooting cơ bản
Lỗi: nginx.conf test failed
# Kiểm tra chi tiết lỗi sudo nginx -tXem error log
sudo tail -f /var/log/nginx/error.log
Lỗi: Port 80 already in use
# Xem process nào đang dùng port 80 sudo lsof -i :80hoặc
sudo netstat -tulpn | grep :80
Kill process nếu cần
sudo kill -9 <PID>
Lỗi: Permission denied
# Kiểm tra user trong nginx.conf grep user /etc/nginx/nginx.confKiểm tra quyền thư mục
ls -la /var/www/html
Fix ownership
sudo chown -R www-data:www-data /var/www/html
Không truy cập được qua browser:
# Kiểm tra firewall (Ubuntu/Debian) sudo ufw status sudo ufw allow 'Nginx Full'Kiểm tra firewall (CentOS)
sudo firewall-cmd --list-all sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
Kiểm tra SELinux (CentOS)
sudo getenforce sudo setenforce 0 # Tạm thời disable để test
6. Bài tập thực hành
Bài tập 1: Cài đặt và verify
- Cài đặt Nginx trên hệ điều hành của bạn
- Kiểm tra version và trạng thái
- Truy cập http://localhost và xem trang welcome mặc định
- Tìm và xem file log access.log
Bài tập 2: Làm quen với commands
- Test cấu hình:
nginx -t - Reload Nginx
- Stop và start lại Nginx
- Kiểm tra processes đang chạy
Bài tập 3: Tìm hiểu cấu trúc
- Mở file nginx.conf và đọc các directive
- Tìm document root trong virtual host mặc định
- Tạo file HTML đơn giản trong document root
- Truy cập file qua browser
Bài tập 4: Sửa lỗi cố ý
- Thêm dòng sai cú pháp vào nginx.conf
- Chạy
nginx -tđể xem lỗi - Sửa lỗi và test lại
Tổng kết
Trong bài này, bạn đã học:
- ✅ Nginx là gì và kiến trúc event-driven
- ✅ So sánh Nginx vs Apache
- ✅ Cài đặt Nginx trên nhiều hệ điều hành
- ✅ Cấu trúc thư mục và file cấu hình
- ✅ Các lệnh quản lý Nginx cơ bản
Bài tiếp theo: Chúng ta sẽ đi sâu vào cấu hình Nginx, tìm hiểu về context, directive, virtual hosts và serving static files.