前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenResty基于Redis 的动态路由你知道吗?

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

作者头像
友儿
发布2022-09-11 17:44:24
8400
发布2022-09-11 17:44:24
举报
文章被收录于专栏:友儿友儿
其他相关文章请看这里!

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首页

?

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 其他相关文章请看这里!
  • 使用 redis根据请求的User-Agent标头将传入的请求路由到不同的HTTP后端
  • 配置
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com