【问题标题】:How to serve Redis key with Nginx?如何使用 Nginx 提供 Redis 密钥?
【发布时间】:2021-08-20 04:36:07
【问题描述】:

我的所有 JSON 文件都位于 Redis 缓存中。

我想通过 Nginx 获得它。

    # redis-cli -h redis-master
    redis-master:6379> get "zips/80202.json"
       "{\"zipCode\":\"80202\",\"City\":\"DENVER\",\"StateCode\":\"CO\"}"

我想请求的网址是这样的,

http://nginx-host/zips/80202.json

nginx-hostredis-master 是 Kubernetes 中的服务。

期待回应,

{"zipCode":"80202","City":"DENVER","StateCode":"CO"}

我没有找到关于如何配置 Nginx 的明确想法。我使用 Kubernetes 容器运行,因此服务是本地的,无需对 Redis 服务器进行身份验证。

【问题讨论】:

    标签: nginx kubernetes redis nginx-config


    【解决方案1】:

    这里是使用 redis key 服务的 nginx 配置,

    resolver local=on ipv6=off;
    
    server {
        listen 9000;
    
        location / {
    
            set $target '';
            access_by_lua '
                local key = ngx.var.request_uri
                if not key then
                    ngx.log(ngx.ERR, "no key requested")
                    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("redis-master.default.svc.cluster.local", 6379)
                if not ok then
                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)
                    return ngx.exit(500)
                end
    
                local value, err = red:get(key)
    
                if not value then
                    ngx.log(ngx.ERR, "failed to get redis key: ", err)
                    ngx.status = 500
                    ngx.say("Something not right")
                    return ngx.exit(ngx.OK)
                end
    
                if value == ngx.null then
                    ngx.log(ngx.ERR, "no host found for key ", key)
                    ngx.status = 404
                    ngx.say("Not found")
                    return ngx.exit(ngx.OK)
                end
    
                if value then
                    ngx.say(value)
                    return
                end
    
                ngx.var.target = http
            ';
    
            
        }
    }
    

    【讨论】:

      【解决方案2】:

      要通过 Nginx 提供 redis 数据(键:值)对,您需要以下内容:

      1. 例如,一个 redis 客户端, https://github.com/NodeRedis/node-redis。该客户将提供帮助 从 redis 中检索数据。您必须使用 NodeJs Express 为您提供 API 层
      2. 您必须创建一个必须公开的服务 通过入口控制器(如果你想从外部访问它 您的 K8s 集群
      3. Nginx 入口控制器配置将请求路由到此服务

      【讨论】:

      • nginx有一个模块可以和redis集成,不需要做任何一层代码从redis中拉取数据。 nginx.com/resources/wiki/modules/redis2 。我尝试了几种不同的配置,但它们都不起作用。
      • 看来json转换是redis2项目的待办事项。
      • 通过 http,您发送的所有响应都将作为流/字符串,而不是 json 对象。根据内容类型,客户端将数据转换为各自的对象。 http 本身与内容无关。
      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      相关资源
      最近更新 更多