其他相关文章请看这里!

OpenResty是个什么鬼?
谷歌浏览器自定义请求头之ModHeader插件

使用 redis根据请求的User-Agent标头将传入的请求路由到不同的HTTP后端

  • 采用了模块Redis2 Nginx的模块, Lua的Nginx的模块,Lua的Redis的解析库,并设置其它的Nginx模块集束OpenResty

配置

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

     mkdir /home/www
     cd /home/www/
     mkdir logs/ conf/
  • conf 目录下创建一个 nginx.conf 文件

    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 指定配置文件。)

    nginx -p `pwd`/ -c conf/nginx.conf
    #查看nginx进程是否启用
    ps -ef|grep nginx|grep -v grep
  • 测试
  • 测试前准备

    • docker安装redis

      # 命令来查看可用版本
      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 
    • 连接客户端写入路由

      redis> set foo apache.org
       OK
      redis> set bar nginx.org
       OK

      连接客户端写入路由

    • linux测试访问

      #访问到apache.org首页
      curl --user-agent foo localhost:8080
      #访问到nginx.org首页
      curl --user-agent bar localhost:8080
    • chrome浏览器测试

      • 假设你已经安装好ModHeader插件,文章开始已经列出了安装插件的相关文章,请自行去了解。
      • 设置User-Agent:foo 访问到apache.org首页,设置User-Agent:bar访问到nginx.org首页

未设置请求头则无法找到响应
设置请求头User-Agent:foo 则访问到apache.org首页
未设置请求头User-Agent:bar则访问到nginx.org首页

Last modification:July 2, 2022
如果觉得我的文章对你有用,请随意赞赏