502 Bad Gateway thuộc nhóm mã lỗi khá hữu ích, vì nó cho biết một điều cụ thể: yêu cầu của bạn đã tới được một máy chủ, máy chủ đó chuyển tiếp cho một máy khác phía sau, và câu trả lời nhận về không dùng được. Website không đơn thuần "sập" — có một mắt xích trong chuỗi bị đứt.
Biết được mắt xích nào thu hẹp phạm vi tìm kiếm rất nhiều. Bài này giải thích "gateway" thực chất là gì, khác biệt giữa 502 với 500 và 504 vốn hay bị nhầm, các nguyên nhân xếp theo mức độ thường gặp thực tế, và bạn có thể làm gì nếu đang dùng shared hosting và không chạm được vào máy chủ.
"Bad Gateway" thực chất nghĩa là gì
Phần lớn website không do một chương trình duy nhất phục vụ. Máy chủ phía trước — thường là Nginx, Apache hoặc một CDN như Cloudflare — nhận yêu cầu của bạn rồi chuyển cho thứ nằm phía sau: PHP-FPM, một tiến trình Node, một ứng dụng Python, hay một web server khác. Trong sắp đặt đó, máy chủ phía trước đóng vai gateway.
502 là cách máy chủ phía trước nói một cách trung thực rằng nó đã làm xong việc của mình còn thứ phía sau thì không. Hoặc không trả lời gì, hoặc trả lời với định dạng nó không đọc được, hoặc bị ngắt kết nối giữa chừng. Bản thân máy chủ phía trước vẫn khỏe — chính vì thế bạn nhận được một trang lỗi được định dạng đàng hoàng chứ không phải timeout.
502 khác 500 và 504 ra sao
Ba mã này hay bị gộp chung thành "lỗi máy chủ", khiến người ta tìm sai chỗ. Thực tế chúng chỉ về những thành phần khác nhau.
| Mã | Ý nghĩa | Xem ở đâu trước |
|---|---|---|
| 500 Internal Server Error | Ứng dụng đã chạy rồi ném ra lỗi | Code của bạn, error log PHP, plugin hoặc theme hỏng |
| 502 Bad Gateway | Backend trả về phản hồi rỗng hoặc không hợp lệ | Tiến trình backend có chạy không? Có crash hay hết bộ nhớ? |
| 503 Service Unavailable | Máy chủ sống nhưng cố ý không phục vụ | Chế độ bảo trì, bảo vệ quá tải, hàng đợi đầy |
| 504 Gateway Timeout | Backend tới được nhưng trả lời quá chậm | Truy vấn chậm, API bên ngoài chậm, cấu hình timeout |
Nguyên nhân thường gặp, phổ biến nhất trước
- Tiến trình backend đã crash hoặc chưa từng được khởi động. PHP-FPM, Node hay service ứng dụng không chạy nên máy chủ phía trước không có ai để nói chuyện. Đây là nguyên nhân phổ biến nhất, bỏ xa các nguyên nhân khác.
- Máy chủ hết bộ nhớ và kernel đã giết backend. Tìm dòng OOM-killer trong log hệ thống — tiến trình biến mất mà không để lại lỗi nào của riêng nó, và đó chính là thứ tạo ra 502.
- Backend quá tải và từ chối kết nối mới. Toàn bộ worker PHP-FPM đang bận nên yêu cầu mới bị từ chối thẳng thay vì xếp hàng.
- Cấu hình proxy trỏ sai đích. Sau một lần triển khai hoặc đổi cấu hình, máy chủ phía trước trỏ nhầm cổng hoặc socket. Nếu 502 xuất hiện ngay sau một thay đổi, hãy bắt đầu từ đây.
- Một quy tắc tường lửa giữa hai thành phần. Hay gặp ở kiến trúc nhiều máy chủ khi front end và ứng dụng nằm trên các máy khác nhau.
- Backend trả về dữ liệu sai định dạng. Một fatal error PHP in ra trước header, hoặc một tiến trình ghi vào stdout khi không nên, tạo ra phản hồi mà gateway không phân tích được.
- Vấn đề ở CDN hoặc reverse proxy. Nếu bạn dùng Cloudflare, 502 có thể đến từ chính Cloudflare chứ không phải origin — trang lỗi thường ghi rõ bên nào.
Kiểm tra theo thứ tự này
Trình tự sau được sắp xếp để loại trừ nguyên nhân khả dĩ nhất với ít công nhất, đồng thời tránh sai lầm kinh điển là khởi động lại lung tung cho đến khi có gì đó thay đổi.
- Kiểm tra backend có đang chạy không. Trên máy chủ Linux: "systemctl status php-fpm" hoặc lệnh tương đương cho stack của bạn. Nếu nó chết, đó là câu trả lời và câu hỏi tiếp theo là tại sao.
- Đọc error log của máy chủ phía trước trước khi khởi động lại bất cứ thứ gì. Nginx ghi lý do thật vào /var/log/nginx/error.log — các thông báo "connect() failed", "no live upstreams" và "recv() failed" mỗi cái chỉ về một hướng khác nhau. Khởi động lại trước sẽ xóa mất bằng chứng này.
- Kiểm tra bộ nhớ trống và tìm OOM killer trong log hệ thống. Nếu backend liên tục chết khi tải tăng mà không ghi lỗi của riêng nó, kernel đang giết nó và máy quá nhỏ so với lưu lượng.
- Xác nhận đích proxy khớp với nơi backend thực sự lắng nghe — cổng hoặc đường dẫn socket trong cấu hình máy chủ phía trước so với trong cấu hình backend. Sai một chữ số là đủ.
- Khởi động lại backend, rồi tới máy chủ phía trước, theo đúng thứ tự đó. Chỉ làm sau khi đã thu thập bằng chứng.
- Nếu lỗi lúc có lúc không thay vì liên tục, hãy đối chiếu với biểu đồ lưu lượng. 502 xuất hiện lúc cao điểm và biến mất lúc vắng là vấn đề công suất, không phải lỗi cấu hình, và không cách chỉnh cấu hình nào chữa được.
Làm được gì trên shared hosting
Trên shared hosting bạn không kiểm tra được PHP-FPM hay đọc được log hệ thống, nên phần lớn các bước trên đóng lại. Điều đó không có nghĩa bạn bất lực, nhưng cách tiếp cận đúng là khác.
Hãy bắt đầu bằng việc xác định lỗi chỉ ảnh hưởng website của bạn hay mọi website trên máy chủ đó — nếu nhà cung cấp có trang trạng thái, xem ở đó trước. Sau đó nghĩ xem phía bạn có gì thay đổi: cập nhật plugin, đổi theme, hay một script đột nhiên ngốn bộ nhớ nhiều hơn hẳn. Hoàn tác thay đổi đó thường nhanh hơn là chẩn đoán nó.
Nếu 502 cứ quay lại ở mức lưu lượng bình thường, câu trả lời trung thực thường là tài khoản đã vượt quá khả năng của shared hosting. Trên máy chủ dùng chung, tài nguyên của bạn chia sẻ với mọi người khác, và một đợt tăng lưu lượng của hàng xóm có thể hạ gục website bạn mà bạn chẳng làm gì sai. Chuyển sang VPS với CPU và RAM riêng loại bỏ hẳn nhóm vấn đề này, đồng thời cho bạn log cần thiết để tự chẩn đoán lần sau.
Đừng chia sẻ máy chủ với đợt tăng lưu lượng của người khác
Cloud VPS với CPU và RAM riêng, quyền root đầy đủ và log thật để bạn tự đọc — từ ฿150/tháng.
Câu hỏi thường gặp
502 là lỗi của tôi hay của nhà cung cấp hosting?
Tùy thành phần nào hỏng. Nếu ứng dụng của bạn crash hoặc hết bộ nhớ, đó là phía bạn. Nếu hạ tầng hoặc mạng của nhà cung cấp hỏng, đó là phía họ. Cách nhanh nhất để biết là xem các website khác trên cùng máy chủ có bị ảnh hưởng không — nếu có, không phải code của bạn.
Vì sao 502 lúc có lúc không thay vì hỏng liên tục?
502 chập chờn hầu như luôn là giới hạn công suất chứ không phải lỗi cấu hình. Khi tải tăng, backend hết worker hoặc hết bộ nhớ, bỏ rơi yêu cầu, rồi hồi phục khi lưu lượng giảm. Ngược lại, lỗi cấu hình làm hỏng mọi yêu cầu một cách nhất quán.
502 có hại cho SEO không?
Nếu ngắn thì không. Google thử lại và coi gián đoạn ngắn là tạm thời. 502 kéo dài nhiều ngày lại khác — tốc độ thu thập giảm và trang có thể rơi khỏi chỉ mục. Quy tắc thực tế: tính bằng giờ thì chịu được, tính bằng ngày thì không.
Tôi dùng Cloudflare. Làm sao biết 502 đến từ Cloudflare hay máy chủ của tôi?
Trang lỗi của Cloudflare có nhận diện riêng, kèm ray ID và sơ đồ chỉ ra chặng nào hỏng. 502 trơn không định dạng là đến từ origin của bạn. Nếu sơ đồ chỉ điểm hỏng ở origin, Cloudflare vẫn ổn và vấn đề nằm ở phía bạn.
GUIDES
Bài viết liên quan
Đọc tiếp các chủ đề tương tự
500 Internal Server Error — Nguyên nhân và cách sửa
500 là lỗi ít thông tin nhất trên web: nó nghĩa là "có gì đó hỏng và tôi sẽ không nói là gì". Tin tốt là máy chủ gần như luôn ghi lý do thật vào một file log. Bài này chỉ chỗ file đó và thứ tự kiểm tra nhanh nhất để tìm ra thủ phạm.
Đọc tiếp504 Gateway Timeout — Nguyên nhân và cách khắc phục
504 không phải backend chết, mà là backend còn sống nhưng quá chậm. Điều đó đổi hoàn toàn chỗ bạn cần tìm: không phải log crash, mà là truy vấn hoặc lệnh gọi bên ngoài đang chạy lâu hơn thời gian máy chủ chịu chờ.
Đọc tiếpERR_CONNECTION_TIMED_OUT — Nguyên nhân và cách khắc phục
Trang quay mãi rồi Chrome bỏ cuộc với ERR_CONNECTION_TIMED_OUT. Bài này chỉ cách xác định trong hai phút vấn đề nằm ở phía bạn hay phía máy chủ, rồi các bước sửa tương ứng cho từng phía.
Đọc tiếp