Phân Biệt HTTP 502 Bad Gateway vs 504 Gateway Timeout
Khi hệ thống của bạn đứng sau một Reverse Proxy (Nginx, Cloudflare, Traefik) hoặc API Gateway, việc người dùng nhìn thấy trang thông báo lỗi mã 5xx là thảm họa. Nhưng 502 và 504 báo hiệu hai căn bệnh hoàn toàn khác nhau của hệ thống Backend.
1. Mô hình kiến trúc Reverse Proxy
[Client / Browser]
│
▼ (1) HTTP Request
[Reverse Proxy: Nginx / Cloudflare / ALB]
│
▼ (2) Upstream Proxy Pass
[Backend Service: Node.js, Go, PHP-FPM, Python Gunicorn]
│
▼
[Database]
Trong mô hình này:
- Nginx đóng vai trò là Gateway (Cổng).
- Ứng dụng Backend phía sau được gọi là Upstream.
2. HTTP 502 Bad Gateway: "Nhận được phản hồi rác hoặc từ chối kết nối"
Bản chất:
Reverse Proxy cố gắng kết nối tới Backend, nhưng nhận lại phản hồi không hợp lệ từ Backend, hoặc Backend đột ngột đóng kết nối (Connection reset by peer).
Nguyên nhân phổ biến:
- Backend bị Crash / OOMKilled: Tiến trình Node.js hoặc Python bị quá tải bộ nhớ và sập ngay khi request vừa tới.
- Backend chưa khởi động xong: Port của backend chưa lắng nghe nhưng Nginx đã vội vã chuyển traffic tới.
- Lỗi socket hoặc quyền truy cập: File socket unix (
php-fpm.sock) bị sai phân quyền chown hoặc buffer header trả về quá lớn (upstream sent too big header).
Cách chẩn đoán trong Nginx error.log:
sudo tail -f /var/log/nginx/error.log | grep -E "connect\(\) failed|Connection refused"
Thông báo thường gặp: connect() failed (111: Connection refused) while connecting to upstream.
3. HTTP 504 Gateway Timeout: "Chờ mãi mà không thấy Backend trả lời"
Bản chất:
Reverse Proxy kết nối thành công tới Backend, nhưng Backend xử lý quá lâu, vượt quá ngưỡng thời gian chờ cho phép (proxy_read_timeout) của Proxy.
Nguyên nhân phổ biến:
- Database Slow Query / Table Lock: Câu lệnh SQL quét toàn bảng (Full table scan) mất 60 giây chưa trả về dữ liệu.
- Third-party API bị treo: Backend đang gọi sang cổng thanh toán hoặc API đối tác bên thứ 3 và bị treo thread.
- Deadlock / Thiếu Worker: Tất cả worker thread của Gunicorn / PHP-FPM đều đang bận xử lý request khác, request mới bị xếp hàng đợi quá lâu.
Cách chẩn đoán:
Thông báo thường gặp trong Nginx log: upstream timed out (110: Connection timed out) while reading response header from upstream.
4. Bảng tóm tắt xử lý sự cố nhanh
| Tiêu chí | HTTP 502 Bad Gateway | HTTP 504 Gateway Timeout |
|---|---|---|
| Triệu chứng chính | Backend sập hoặc ngắt kết nối đột ngột | Backend bị nghẽn, xử lý quá lâu |
| Nơi cần kiểm tra đầu tiên | Trạng thái tiến trình (systemctl status, docker ps, dmesg -T) |
Log Slow Query Database, APM Tracing |
| Cách khắc phục tạm thời | Restart service, kiểm tra cgroups OOM | Tăng tạm proxy_read_timeout 120s;, kill query treo |
| Giải pháp triệt để | Fix memory leak, cấu hình health check chuẩn | Đánh index DB, chuyển tác vụ nặng sang Celery/RabbitMQ |
