OpenResty基于Redis 的动态路由你知道吗?

2022-09-11 17:44:24 浏览数 (1)

其他相关文章请看这里!

OpenResty是个什么鬼?

谷歌浏览器自定义请求头之ModHeader插件

使用 redis根据请求的User-Agent标头将传入的请求路由到不同的HTTP后端
  • 采用了模块Redis2 Nginx的模块, Lua的Nginx的模块,Lua的Redis的解析库,并设置其它的Nginx模块集束OpenResty
配置

创建logs 目录用于存放日志,conf 用于存放配置文件。

代码语言:javascript复制
 mkdir /home/www
 cd /home/www/
 mkdir logs/ conf/

conf 目录下创建一个 nginx.conf 文件

代码语言:javascript复制
worker_processes  1;
error_log logs/error.log info;

events {
  worker_connections 1024;
}

http {
  upstream apache.org {
      server apache.org;
  }

  upstream nginx.org {
      server nginx.org;
  }

  server {
      listen 8080;

      location = /redis {
          #仅限内部调用
          internal;
          #授权
          #redis2_query auth 'pwd';

          #参数解释
          #set_unescape_uri 解码设置参数
          #$arg_key请求中的的参数名,这个变量包含GET请求中,如果有变量key时的值。即“?”后面的key=value形式的key
          #$args请求中的参数值,字符串连接
          set_unescape_uri $key $arg_key;
          redis2_query get $key;
          redis2_pass 192.168.56.2:6379;
      }

      location / {
          set $target '';
          #access_by_lua在请求访问阶段处理,用于访问控制,适用于http、server、location、location if
          #content_by_lua是内容处理器,接受请求并输出响应,适用于location、location if
          access_by_lua '
              local key = ngx.var.http_user_agent
              -- 在使用上面的方法时, 第一个参数只能是内部请求.这里的内部请求是特指nginx配置文件中的internal 路由
              local res = ngx.location.capture(
                  "/redis", { args = { key = key } }
              )

              print("key: ", key)
              -- 连接redis结束nginx
              if res.status ~= 200 then
                  ngx.log(ngx.ERR, "redis server returned bad status: ",
                      res.status)
                  ngx.exit(res.status)
              end
              -- redis返回空结束nginx
              if not res.body then
                  ngx.log(ngx.ERR, "redis returned empty body")
                  ngx.exit(500)
              end
              -- 此模块主要是处理redis请求和响应的
              local parser = require "redis.parser"

              -- redis返回结果解析判断失败结束nginx
              local server, typ = parser.parse_reply(res.body)
              if typ ~= parser.BULK_REPLY or not server then
                  ngx.log(ngx.ERR, "bad redis response: ", res.body)
                  ngx.exit(500)
              end

              print("server: ", server)

              ngx.var.target = server
          ';
          #请求转发
          proxy_pass http://$target;
      }
  }
}

启动 (如果没有任何输出,说明启动成功,-p 指定我们的项目目录,-c 指定配置文件。)

代码语言:javascript复制
nginx -p `pwd`/ -c conf/nginx.conf
#查看nginx进程是否启用
ps -ef|grep nginx|grep -v grep

测试

测试前准备

docker安装redis

代码语言:javascript复制
# 命令来查看可用版本
docker search redis
# 拉取官方的最新版本的镜像
docker pull redis:latest
# 查看是否已安装了 redis
docker images
#运行redis容器
#–requirepass 设置密码
#–appendonly 开启redis 持久化
#例如 docker run -itd --name myredis -p 6379:6379 redis  --requirepass "123456"  --appendonly yes

docker run -itd --name konga-redis -p 6379:6379 redis
#查看容器的运行
docker ps 

连接客户端写入路由

代码语言:javascript复制
redis> set foo apache.org
 OK
redis> set bar nginx.org
 OK

linux测试访问

代码语言:javascript复制
#访问到apache.org首页
curl --user-agent foo localhost:8080
#访问到nginx.org首页
curl --user-agent bar localhost:8080
  • chrome浏览器测试
代码语言:txt复制
- 假设你已经安装好`ModHeader`插件,文章开始已经列出了安装插件的相关文章,请自行去了解。
- 设置User-Agent:foo 访问到apache.org首页,设置User-Agent:bar访问到nginx.org首页

0 人点赞