我试图让nginx在lua和redis的帮助下基于URI执行代理。到目前为止,我能够成功地将'/hello‘这样的简单URI代理到所需的目标。通过将映射保存在redis hashmap中,实现了这一点,
HGETALL "127.0.0.1:8080"
1) "/demo1/test/hello4"
2) "example.com/demo1/test/hello4"
3) "/hello"
4) "example.com/hello"nginx.conf
worker_processes 2;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location / {
resolver 8.8.4.4; # use Google's open DNS server
set $target '';
access_by_lua '
local http_host = ngx.var.http_host
if not http_host then
ngx.log(ngx.ERR, "no http-host found")
return ngx.exit(400)
end
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 second
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.log(ngx.ERR, "failed to connect to redis: ", err)
return ngx.exit(500)
end
local fPath, err = red:hget(http_host, ngx.var.uri)
if not fPath then
ngx.log(ngx.ERR, "No fPath: ", err)
return ngx.exit(500)
end
ngx.var.target = fPath
';
proxy_pass $target;
}
}
}但是,我也想处理动态URI的例子:-
user/id/1 -> "example.com/user/id/1",
user/id/2 -> "example.com/user/id/2",
user/id/3 -> "example.com/user/id/3",
and so on....我不确定如何在redis和lua逻辑中为这个例子创建一个键值对,它能够处理id的动态性。我试着寻找,但没有找到正确的方向或资源来帮助我解决这个问题。
任何帮助都是很棒的!
发布于 2022-01-11 00:12:53
如果您想在生产中实现这一点,我建议使用成熟的API网关,如Apache APISIX或孔子。为了自己实现它,也许您可以在Redis中使用通配符或Lua模式存储路径,以便稍后与原始URI进行匹配。应用一些简单的启发式方法将有助于缩小检查范围。
https://stackoverflow.com/questions/70657542
复制相似问题