免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2385 | 回复: 0
打印 上一主题 下一主题

[Redis] 基于redis和openresty实现一个http动态路由 [复制链接]

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-29 09:58 |只看该作者 |倒序浏览
本帖最后由 cjfeii 于 2016-06-29 09:59 编辑

http://blog.csdn.net/cjfeii/article/details/51159496
http://openresty.org/cn/dynamic-routing-based-on-redis.html
本文的一个例子主要介绍如何利用redis实现对请求头中User-Agent修改已达到路由到两个不同的http后台的目的。这个例子使用了这些openresty组件: Redis2 Nginx Module, Lua Nginx Module, Lua Redis Parser Library, 和 Set Misc Nginx Module。

1. 配置nginx

下面是完整的nginx.conf
  1. worker_processes  1;
  2. error_log logs/error.log info;

  3. events {
  4.     worker_connections 1024;
  5. }

  6. http {
  7.     upstream apache.org {
  8.         server apache.org;
  9.     }

  10.     upstream nginx.org {
  11.         server nginx.org;
  12.     }

  13.     server {
  14.         listen 8080;

  15.         location = /redis {
  16.             internal;
  17.             set_unescape_uri $key $arg_key;
  18.             redis2_query get $key;
  19.             redis2_pass 127.0.0.1:6379;
  20.         }

  21.         location / {
  22.             set $target '';
  23.             access_by_lua '
  24.                 local key = ngx.var.http_user_agent
  25.                 local res = ngx.location.capture(
  26.                     "/redis", { args = { key = key } }
  27.                 )

  28.                 print("key: ", key)

  29.                 if res.status ~= 200 then
  30.                     ngx.log(ngx.ERR, "redis server returned bad status: ",
  31.                         res.status)
  32.                     ngx.exit(res.status)
  33.                 end

  34.                 if not res.body then
  35.                     ngx.log(ngx.ERR, "redis returned empty body")
  36.                     ngx.exit(500)
  37.                 end

  38.                 local parser = require "redis.parser"
  39.                 local server, typ = parser.parse_reply(res.body)
  40.                 if typ ~= parser.BULK_REPLY or not server then
  41.                     ngx.log(ngx.ERR, "bad redis response: ", res.body)
  42.                     ngx.exit(500)
  43.                 end

  44.                 print("server: ", server)

  45.                 ngx.var.target = server
  46.             ';

  47.             proxy_pass http://$target;
  48.         }
  49.     }
  50. }
复制代码
2. 启动redis
  1. $ ./redis-server  # default port is 6379
复制代码
在启动的redis中设置相关key:
  1. $ ./redis-cli
  2. redis> set foo apache.org
  3. OK
  4. redis> set bar nginx.org
  5. OK
复制代码
3. 测试nginx应用:
  1. $ curl --user-agent foo localhost:8080
  2. <apache.org home page goes here>

  3. $ curl --user-agent bar localhost:8080
  4. <nginx.org home page goes here>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP