以下是一个使用Nginx + Lua + Redis的简单示例,用于限流:
http {
# ...
lua_package_path "/path/to/lua/scripts/?.lua;;";
lua_shared_dict my_limit 10m; # 设置共享内存区域
server {
# ...
location / {
# 设置每秒允许的请求数
set $limit_rate 10;
# 检查Redis中的计数器状态,如果未设置则初始化
access_by_lua_block {
local limit = require "resty.limit.req"
local lim, err = limit.new("my_limit", $limit_rate)
if not lim then
ngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err)
return ngx.exit(500)
end
local key = ngx.var.binary_remote_addr
local delay, err = lim:incoming(key, true)
if err then
if err == "rejected" then
ngx.log(ngx.ERR, "rate limit exceeded")
return ngx.exit(429)
end
ngx.log(ngx.ERR, "failed to limit rate: ", err)
return ngx.exit(500)
end
if delay then
ngx.sleep(delay)
end
}
# ...
}
}
}
这个配置定义了一个名为my_limit
的共享内存区域,用于在Nginx中存储计数器状态。每个IP地址被限制为每秒10个请求。如果请求超过限制,Nginx将返回状态码429。
请注意,这只是一个简化示例,实际应用中可能需要更复杂的配置,例如使用Redis进行持久化存储,处理连接失败等情况。