- Published on
Xây dựng Auto HealthCheck Backend trong OpenResty và NGINX
- Authors
- Name
- Bạch Đăng Tuấn
- Occupation
- Kỹ sư công nghệ thông tin
- Zalo: 0934.01.07.04
Mục Lục
- OpenResty
- Cơ chế Health Check trong OpenResty
- Cách hoạt động trong NGINX OSS
- So sánh Health Check OpenResty vs NGINX
- Kết luận
OpenResty
OpenResty là một nền tảng mở rộng từ NGINX, tích hợp với LuaJIT, cho phép bạn viết các logic tùy chỉnh xử lý ngay trong web server layer. Nhờ khả năng scripting bằng Lua, OpenResty có thể thực hiện các tác vụ nâng cao như:
- Chọn backend động theo điều kiện
- Health check backend tùy biến
- Proxy thông minh theo thời gian thực
Xây dựng Auto HealthCheck trong OpenResty
Trong OpenResty, bạn có thể dùng init_worker_by_lua_block
để thực hiện health check backend định kỳ. Lua script sẽ gửi HTTP request đến các backend và ghi nhận trạng thái sống/chết thông qua lua_shared_dict
.

Luồng hoạt động:
- Mỗi 5 giây, Lua gửi request
GET /healthz
đến từng backend - Nếu backend trả HTTP 200 và chứa "ok" → đánh dấu là sống
- Nếu lỗi liên tiếp ≥ 3 lần → loại backend khỏi danh sách
- Mỗi khi có kết nối mới, Lua sẽ chọn ngẫu nhiên 1 backend còn sống để
proxy_pass
Ví dụ Lua Health Check:
init_worker_by_lua_block {
local http = require "resty.http"
local dict = ngx.shared.rancher_api_health
local backends = {
"192.168.140.204", "192.168.140.205", "192.168.140.206"
}
local function check()
for _, ip in ipairs(backends) do
local res, err = http.new():request_uri("http://" .. ip .. ":31501/healthz", { method = "GET" })
local ok = res and res.status == 200 and res.body:find("ok")
local key = "fail:" .. ip
if ok then
dict:set(ip, true)
dict:set(key, 0)
else
local fails = (dict:get(key) or 0) + 1
dict:set(key, fails)
if fails >= 3 then
dict:set(ip, false)
end
end
end
end
ngx.timer.every(5, check)
}
Cách hoạt động trong NGINX OSS
NGINX OSS (phiên bản miễn phí) không hỗ trợ health check chủ động. Điều này có nghĩa là:
- NGINX không tự kiểm tra backend có sống hay không
- Khi backend chết, client sẽ nhận lỗi trực tiếp (502, timeout...)
- Muốn có health check chủ động ➜ phải dùng bản NGINX Plus (trả phí)
❗ Giải pháp thay thế:
- Dùng
max_fails
vàfail_timeout
để NGINX tạm loại backend sau một số lần lỗi:
upstream backend {
server 192.168.1.10 max_fails=3 fail_timeout=10s;
}
➡️ Tuy nhiên cơ chế này bị động và không chính xác bằng health check thật sự.
So sánh Health Check OpenResty vs NGINX
Tiêu chí | OpenResty (Lua) | NGINX OSS |
---|---|---|
Health check chủ động | ✅ Có với Lua | ❌ Không hỗ trợ |
Tùy biến logic check | ✅ Toàn quyền (Lua script) | ❌ Không |
Không cần reload khi lỗi | ✅ Có | ❌ Không |
Loại backend lỗi tự động | ✅ Có | ⚠️ Có qua max_fails |
Tích hợp HTTP/TCP | ✅ Đầy đủ | ⚠️ Có giới hạn |
Scripting động | ✅ Lua mạnh mẽ | ❌ Không hỗ trợ |
Kết luận
Nếu bạn cần một hệ thống proxy động, tự động loại bỏ backend chết mà không cần dùng bản thương mại, thì OpenResty là lựa chọn hàng đầu.
Trong khi đó, NGINX OSS vẫn mạnh cho web tĩnh, proxy đơn giản — nhưng thiếu cơ chế health check chủ động khiến hệ thống dễ giật, lỗi nếu backend die.
✅ Dùng OpenResty khi bạn cần logic proxy thông minh
❗ Dùng NGINX OSS nếu chỉ cần reverse proxy cơ bản */}