Bài 1: Giới thiệu và Cài đặt Nginx

Bài học giới thiệu Nginx với kiến trúc event-driven, hướng dẫn cài đặt trên Ubuntu/CentOS/macOS/Windows, cấu trúc thư mục và các lệnh quản lý cơ bản như start, stop, reload. Bạn sẽ hiểu sự khác biệt Nginx vs Apache và troubleshooting các lỗi thường gặp.

8 min read
Bài 1: Giới thiệu và Cài đặt Nginx

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-drivennon-blocking I/O (asynchronous).

Cách hoạt động:

  1. Master Process: Một tiến trình chính đọc và đánh giá cấu hình, quản lý worker processes
  2. Worker Processes: Nhiều tiến trình worker xử lý các kết nối thực tế
  3. 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 update

# Cà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-keyring

# Import official nginx signing key
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

# Setup repository
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

# Update 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 -y

# CentOS 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
EOF

# Cà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:\nginx

# Mở 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 -v

# Test 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 nginx

# Dừ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 -t

# Test 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 reload
# hoặ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 stop

# Quit 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 nginx

# Kiể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 -t

# Xem 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 :80
# hoặ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.conf

# Kiể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

  1. Cài đặt Nginx trên hệ điều hành của bạn
  2. Kiểm tra version và trạng thái
  3. Truy cập http://localhost và xem trang welcome mặc định
  4. Tìm và xem file log access.log

Bài tập 2: Làm quen với commands

  1. Test cấu hình: nginx -t
  2. Reload Nginx
  3. Stop và start lại Nginx
  4. Kiểm tra processes đang chạy

Bài tập 3: Tìm hiểu cấu trúc

  1. Mở file nginx.conf và đọc các directive
  2. Tìm document root trong virtual host mặc định
  3. Tạo file HTML đơn giản trong document root
  4. Truy cập file qua browser

Bài tập 4: Sửa lỗi cố ý

  1. Thêm dòng sai cú pháp vào nginx.conf
  2. Chạy nginx -t để xem lỗi
  3. 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.

Nginx Installation setup WebServer EventDriven NonBlockingIO NginxVsApache ubuntu CentOS linux

Đánh dấu hoàn thành (Bài 1: Giới thiệu và Cài đặt Nginx)