跳到主要内容

OpenResty/Nginx + Lua 实战

基于 OpenResty 在 Nginx 阶段钩入 Lua,实现高性能网关/边车逻辑。

阶段与指令

  • init_by_lua*init_worker_by_lua* 初始化。
  • access_by_lua*rewrite_by_lua*header_filter_by_lua* 等阶段。

共享字典与限流

  • lua_shared_dict 存放热点数据与限流计数。
  • 结合 resty.limit.req 实现漏桶限流。

示例 Nginx 配置:

lua_shared_dict limits 10m;

init_by_lua_block {
local limit_req = require "resty.limit.req"
rate_limiter, err = limit_req.new("limits", 100, 200) -- 100 r/s, burst 200
}

server {
location /api {
access_by_lua_block {
local delay, err = rate_limiter:incoming("api", true)
if not delay then
ngx.status = 429; ngx.say("Too Many Requests"); return ngx.exit(429)
end
if delay > 0 then ngx.sleep(delay) end
}
proxy_pass http://backend;
}
}

与下游交互

  • lua-resty-http 调用后端;缓存与熔断重试策略。
local http = require 'resty.http'
local cli = http.new()
cli:set_timeout(200)
local res, err = cli:request_uri('http://127.0.0.1:8080/health', { method = 'GET' })
if not res or res.status ~= 200 then
ngx.status = 502; ngx.say('bad gateway')
else
ngx.say(res.body)
end