Giới thiệu
Nginx (đọc là "engine-x") là một máy chủ web hiệu suất cao, proxy ngược và bộ cân bằng tải. Được tạo ra bởi Igor Sysoev vào năm 2004, Nginx đã trở thành một trong những máy chủ web phổ biến nhất trên thế giới nhờ vào hiệu quả, độ ổn định và khả năng tiêu tốn tài nguyên thấp.
Tính năng chính
- Hiệu suất cao: Có khả năng xử lý hàng ngàn kết nối đồng thời.
- Tiêu tốn bộ nhớ thấp: Sử dụng tài nguyên hiệu quả.
- Proxy ngược: Chuyển hướng yêu cầu đến các máy chủ backend.
- Cân bằng tải: Phân phối lưu lượng truy cập giữa nhiều máy chủ.
- Kết thúc SSL/TLS: Xử lý các kết nối được mã hóa.
- Phục vụ tệp tĩnh: Xuất sắc trong việc phục vụ nội dung tĩnh.
- Caching HTTP: Tính năng caching tích hợp sẵn.
Cài đặt
Ubuntu/Debian
sudo apt update
sudo apt install nginx
CentOS/RHEL/Fedora
# CentOS/RHEL
sudo yum install nginx
# Fedora
sudo dnf install nginx
macOS (sử dụng Homebrew)
brew install nginx
Khởi động và Kích hoạt Nginx
# Bắt đầu nginx
sudo systemctl start nginx
# Kích hoạt nginx khởi động cùng hệ thống
sudo systemctl enable nginx
# Kiểm tra trạng thái
sudo systemctl status nginx
Cấu hình cơ bản
Cấu trúc tệp cấu hình
Tệp cấu hình Nginx thường nằm ở:
- Tệp cấu hình chính:
/etc/nginx/nginx.conf - Cấu hình trang:
/etc/nginx/sites-available/và/etc/nginx/sites-enabled/ - Cấu hình bổ sung:
/etc/nginx/conf.d/
Cấu trúc cơ bản của nginx.conf
# Ngữ cảnh chính
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Ngữ cảnh sự kiện
events {
worker_connections 1024;
use epoll;
}
# Ngữ cảnh HTTP
http {
# Loại MIME và cài đặt cơ bản
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Ghi nhật ký
access_log /var/log/nginx/access.log;
# Cài đặt hiệu suất
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
# Bao gồm cấu hình bổ sung
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Các trường hợp sử dụng phổ biến
1. Máy chủ web tĩnh
Tạo một tệp cấu hình để phục vụ nội dung tĩnh:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# Tối ưu hóa phục vụ tệp tĩnh
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
2. Proxy ngược
Chuyển hướng yêu cầu đến máy chủ ứng dụng backend:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
3. Bộ cân bằng tải
Phân phối lưu lượng đến nhiều máy chủ backend:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4. Cấu hình SSL/HTTPS
Cấu hình kết thúc SSL với chứng chỉ Let's Encrypt:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Cấu hình SSL hiện đại
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Cấu hình nâng cao
Giới hạn tỷ lệ
Bảo vệ máy chủ của bạn khỏi lạm dụng:
http {
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
listen 80;
server_name api.example.com;
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
}
}
Caching
Thực hiện caching HTTP:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
}
}
Nén dữ liệu
Kích hoạt nén gzip:
http {
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/xml+rss
application/json;
}
Thực hành bảo mật tốt nhất
Ẩn phiên bản Nginx
http {
server_tokens off;
}
Các tiêu đề bảo mật
server {
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}
Giới hạn IP
location /admin {
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
}
Các lệnh phổ biến
Kiểm tra cấu hình
# Kiểm tra cú pháp cấu hình
sudo nginx -t
# Kiểm tra cấu hình và hiển thị chi tiết
sudo nginx -T
Tải lại cấu hình
# Tải lại cấu hình mà không bị gián đoạn
sudo systemctl reload nginx
# Hoặc sử dụng lệnh nginx
sudo nginx -s reload
Quản lý dịch vụ
# Bắt đầu nginx
sudo systemctl start nginx
# Dừng nginx
sudo systemctl stop nginx
# Khởi động lại nginx
sudo systemctl restart nginx
# Kiểm tra trạng thái
sudo systemctl status nginx
Khắc phục sự cố
Kiểm tra nhật ký
# Nhât ký lỗi
sudo tail -f /var/log/nginx/error.log
# Nhât ký truy cập
sudo tail -f /var/log/nginx/access.log
Các vấn đề phổ biến
Quyền bị từ chối (403 Forbidden)
- Kiểm tra quyền tệp:
chmod 644 filesvàchmod 755 directories - Xác minh người dùng nginx có quyền truy cập vào thư mục gốc tài liệu
- Kiểm tra cài đặt SELinux nếu có.
Kết nối bị từ chối
- Xác minh nginx đang chạy:
systemctl status nginx - Kiểm tra xem cổng có đang được sử dụng không:
netstat -tlnp | grep :80 - Xem lại cài đặt tường lửa.
Lỗi cấu hình
- Luôn kiểm tra cấu hình trước khi tải lại:
nginx -t - Kiểm tra lỗi cú pháp trong các tệp cấu hình.
- Xác minh các đường dẫn tệp tồn tại và có thể truy cập.
Tinh chỉnh hiệu suất
Quy trình làm việc và kết nối
# Đặt thành số lượng lõi CPU
worker_processes auto;
events {
# Tăng cho các trang web có lưu lượng cao
worker_connections 2048;
use epoll;
multi_accept on;
}
Kích thước bộ đệm
http {
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;
}
Thời gian chờ
http {
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
}
Giám sát
Giám sát cơ bản với Stub Status
server {
listen 80;
server_name localhost;
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
}
Phân tích nhật ký
Sử dụng các công cụ như GoAccess để phân tích nhật ký:
goaccess /var/log/nginx/access.log --log-format=COMBINED
Kết luận
Nginx là một máy chủ web mạnh mẽ và linh hoạt có thể xử lý nhiều tình huống từ việc phục vụ tệp tĩnh đơn giản đến cấu hình cân bằng tải phức tạp. Chìa khóa để thành thạo Nginx là hiểu cấu trúc cấu hình của nó và dần dần xây dựng độ phức tạp khi cần thiết.
Bắt đầu với các cấu hình cơ bản và từ từ thêm các tính năng như SSL, caching và tiêu đề bảo mật. Luôn kiểm tra các cấu hình của bạn trước khi áp dụng vào môi trường sản xuất và giám sát hiệu suất máy chủ của bạn để đảm bảo hoạt động tối ưu.
Đối với các triển khai sản xuất, hãy xem xét việc thực hiện các chiến lược giám sát, ghi nhật ký và sao lưu thích hợp để duy trì hạ tầng web vững chắc.
Hãy chia sẻ suy nghĩ của bạn và góp ý cho bài viết này nếu bạn thấy bất kỳ điều gì không thuận tiện! Chúc bạn thành công!