Bài 12: Nginx cơ bản và reverse proxy

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.

Sau bài này anh sẽ biết:

  • 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

502 thường nghĩa là Nginx không nói chuyện được với backend. Kiểm tra backend có chạy không, port có listen không, proxy_pass đúng không và log backend ghi gì.
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_name sai domain.
  • Backend chỉ bind localhost nhưng proxy sai IP/port.
  • Permission thư mục web sai.
Lưu ý production: Luôn backup config trước khi sửa và dùng reload thay vì restart nếu có thể.

8. Checklist Nginx

  1. nginx -t pass.
  2. Service active.
  3. Port 80/443 listen.
  4. DNS trỏ đúng IP.
  5. Access/error log không có lỗi mới.

9. Bài tập

  1. Viết server block static site.
  2. Viết reverse proxy tới port 3000.
  3. 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/alias hoặ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.

Tác giả: Mạnh Hoàng

Tôi là Hoàng Mạnh, người sáng lập blog SysadminSkills.com. Tôi viết về quản trị hệ thống, bảo mật máy chủ, DevOps và cách ứng dụng AI để tự động hóa công việc IT. Blog này là nơi tôi chia sẻ những gì đã học được từ thực tế – đơn giản, ngắn gọn và áp dụng được ngay.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *