首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有nginx、lua和redis的动态路由

具有nginx、lua和redis的动态路由
EN

Stack Overflow用户
提问于 2022-01-10 18:53:24
回答 1查看 1.1K关注 0票数 0

我试图让nginx在lua和redis的帮助下基于URI执行代理。到目前为止,我能够成功地将'/hello‘这样的简单URI代理到所需的目标。通过将映射保存在redis hashmap中,实现了这一点,

代码语言:javascript
复制
HGETALL "127.0.0.1:8080"
1) "/demo1/test/hello4"
2) "example.com/demo1/test/hello4"
3) "/hello"
4) "example.com/hello"

nginx.conf

代码语言:javascript
复制
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的例子:-

代码语言:javascript
复制
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的动态性。我试着寻找,但没有找到正确的方向或资源来帮助我解决这个问题。

任何帮助都是很棒的!

EN

回答 1

Stack Overflow用户

发布于 2022-01-11 00:12:53

如果您想在生产中实现这一点,我建议使用成熟的API网关,如Apache APISIX孔子。为了自己实现它,也许您可以在Redis中使用通配符或Lua模式存储路径,以便稍后与原始URI进行匹配。应用一些简单的启发式方法将有助于缩小检查范围。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70657542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档