Blog chia sẻ về công nghệ ...
Published on

Xây dựng Auto HealthCheck Backend trong OpenResty và NGINX

Authors

Mục Lục

  1. OpenResty
  2. Cơ chế Health Check trong OpenResty
  3. Cách hoạt động trong NGINX OSS
  4. So sánh Health Check OpenResty vs NGINX
  5. 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.

gioi-thieu-rke2

Luồng hoạt động:

  1. Mỗi 5 giây, Lua gửi request GET /healthz đến từng backend
  2. Nếu backend trả HTTP 200 và chứa "ok" → đánh dấu là sống
  3. Nếu lỗi liên tiếp ≥ 3 lần → loại backend khỏi danh sách
  4. 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_failsfail_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 */}

Kết quả thử nghiệm: