Bài 12: Nginx cơ bản và reverse proxy
Bài này giúp anh hiểu Nginx, server block, reverse proxy và quy trình kiểm tra lỗi 404/502/SSL.
- Nginx dùng để làm gì.
- Cấu trúc server block cơ bản.
- Proxy request vào backend app.
- Test config và đọc log Nginx.
Chốt ý nhanh
| Chủ đề | Điểm cần nhớ |
|---|---|
| Nginx | Thường đứng trước ứng dụng để phục vụ web hoặc reverse proxy. |
| Cấu hình | Mọi thay đổi nên đi qua bước nginx -t trước khi reload. |
| Lỗi hay gặp | 404, 403, 502 thường đến từ config, backend, quyền file hoặc DNS. |
1. Nginx là gì?
Nginx có thể phục vụ static file hoặc làm reverse proxy đứng trước app Node/Python/PHP. Client gọi domain, Nginx nhận request rồi chuyển vào backend.
2. File/thư mục quan trọng
/etc/nginx/nginx.conf /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ /var/log/nginx/access.log /var/log/nginx/error.log
3. Server block tối thiểu
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
4. Reverse proxy mẫu
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
5. Lab kiểm tra Nginx
sudo nginx -t sudo systemctl reload nginx systemctl status nginx sudo tail -n 100 /var/log/nginx/error.log curl -I http://127.0.0.1
6. Tình huống thực tế: lỗi 502
ss -tulpn | grep 3000 curl -I http://127.0.0.1:3000 sudo tail -n 100 /var/log/nginx/error.log
7. Lỗi thường gặp
- Sửa config nhưng quên
nginx -t. server_namesai domain.- Backend chỉ bind localhost nhưng proxy sai IP/port.
- Permission thư mục web sai.
8. Checklist Nginx
nginx -tpass.- Service active.
- Port 80/443 listen.
- DNS trỏ đúng IP.
- Access/error log không có lỗi mới.
9. Bài tập
- Viết server block static site.
- Viết reverse proxy tới port 3000.
- Mô tả cách debug 502.
Phần thực hành mở rộng: Nginx như lớp cửa trước của ứng dụng
Nginx là thứ xuất hiện rất nhiều trong production. Người mới nên hiểu không chỉ cách viết server block, mà còn cách suy luận khi 404/502/SSL xảy ra.
Lab 1: Dựng static site tối thiểu
sudo mkdir -p /var/www/lab-static
echo 'hello nginx' | sudo tee /var/www/lab-static/index.html
cat <<'EOF' | sudo tee /etc/nginx/sites-available/lab-static
server {
listen 80;
server_name _;
root /var/www/lab-static;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/lab-static /etc/nginx/sites-enabled/lab-static
sudo nginx -t
sudo systemctl reload nginx
curl -I http://127.0.0.1
Lab 2: Reverse proxy vào backend giả lập
python3 -m http.server 3000 --bind 127.0.0.1 &
cat <<'EOF' | sudo tee /etc/nginx/sites-available/lab-proxy
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1: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;
}
}
EOF
Sau đó test lại bằng nginx -t, reload và curl.
Lab 3: Debug 502 có chủ đích
Hãy dừng backend port 3000 rồi test lại. Khi đó anh sẽ thấy vì sao 502 là lỗi “Nginx không nói chuyện được với upstream”.
ss -tulpn | grep 3000
curl -I http://127.0.0.1:3000
sudo tail -50 /var/log/nginx/error.log
Lab 4: Debug quyền file và root path
Nếu static site báo 403/404, đừng vội nghĩ Nginx hỏng. Hãy kiểm tra:
- đường dẫn root có đúng không
- file index có tồn tại không
- permission thư mục/web root có cho Nginx đọc không
Tình huống thực tế
Rất nhiều ca “site down” thật ra chỉ là upstream app chết, config sửa nhầm, hoặc domain trỏ sai server. Nginx thường là chỗ đầu tiên nên kiểm tra, nhưng không phải lúc nào cũng là thủ phạm.
Lỗi phổ biến
- Reload config chưa qua
nginx -t. - Proxy tới sai port hoặc backend chưa chạy.
- Nhầm
root/aliashoặc sai thư mục web. - Chỉ đọc access log mà không đọc error log.
Kết bài
Nếu bài này chắc, anh sẽ bắt đầu đọc Nginx theo đúng vai trò của nó: lớp điều phối request đứng trước ứng dụng. Khi hiểu static site, reverse proxy và cách lần lỗi 502/403/404, anh sẽ đỡ mò hơn rất nhiều trong công việc thật. Bài tiếp theo sẽ đi sâu vào một thành phần sống còn khác phía sau Nginx: database.
