这篇文章主要给大家介绍了利用nginx+lua+redis实现反向代理方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
前言

最近因为工作需要,要进行IVR的重构, 我们现在系统接了三家IVR服务商, N个业务, 由于IVR这玩意一般只能外网回调, 而开发环境又不允许外网随便访问,

着实烦人。 所有我们打算重构一把, 封装多家IVR, 对业务透明, 同时回调可以针对多家IVR服务商的不同callid直接转发到当时请求的同学的

开发域名去。

而不同的IVR服务商的callid参数是不同的,有的是在url里面(call_id), 有的则是直接post的json数据(callid), 所以太扯了。

直接用lua处理下, 查下redis里面这个callid当时是哪位同学发起的请求(请求IVR的时候会写入redis中), 直接proxy_pass到这位同学的开发域名去就ok了。

环境部署

环境直接用openresty吧, redis、json这些常用库都已经打包完毕, 也可以自己安装, 就是太麻烦。

openresty

nginx配置

新建一个vhost, 配置如下

server { server_name ivr.com; access_log /home/work/log/nginx/access.ivr.log; error_log /home/work/log/nginx/error.ivr.log; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 30; proxy_connect_timeout 10; location /ivr/ { lua_code_cache off; resolver 8.8.8.8; set backend'';rewritebyluafile/home/work/tengine−2.1.0/conf/lua/ivr.lua;proxypasshttp://backend ''; rewrite_by_lua_file /home/work/tengine-2.1.0/conf/lua/ivr.lua; proxy_pass http://backend′′;rewriteb​yl​uaf​ile/home/work/tengine−2.1.0/conf/lua/ivr.lua;proxyp​asshttp://backend; } }
不加resolver的话可能会报错, 无法解析,加一个8.8.8.8就可以搞定了。

lua_code_cache 是开发环境的配置, 不缓存lua代码, 修改完lua直接生效, 不然每次要重启nginx, 上生产环境要关掉, 严重影响性能。

不过我们这个需求主要是针对开发环境, 所以无所谓。

lua代码

local redis = require "resty.redis"local cjson = require "cjson"local cache = redis.new()cache.connect(cache, ‘127.0.0.1’, ‘6379’)local args = ngx.req.get_uri_args()local uri = ngx.var.request_urilocal callid = nillocal channel = 0if string.find(uri, ‘yuntongxun’) then callid = args[“callid”] channel = 0elseif string.find(uri, ‘yunhu’) then ngx.req.read_body() local body_data = ngx.req.get_body_data() local data = cjson.decode(body_data) callid = data[‘call_id’] channel = 1elseif string.find(uri, ‘huawei’) then callid = args[“vSessionsId”] channel = 2else endif callid == nil then ngx.say(uri) ngx.say(cjson.encode(args)) ngx.say(‘callid is empty’) return ''endlocal key = callid … ‘_channel’ … channellocal res = cache:get(key)if res == ngx.null then ngx.say(“cache get error”) return ''endngx.var.backend = res http://www.iis7.com/b/ssyqdq/
没啥特别的, 针对多个IVR服务商, 进行解析callid, 然后拼成一个key, 去redis中查询整个key当时写入的value(开发者域名),

最后设置backend整个参数, 然后由nginx进行proxy_pass就完了。

转载于:https://www.cnblogs.com/ngnntds03/p/10626243.html

利用nginx+lua+redis实现反向代理方法教程相关推荐

  1. nginx+lua+redis 灰度发布实现方案

    背景: 公司要把现有的某传统项目进行微服务化,拆分后要分批次预发布,实现某部分使用户使用微服务模块,其他用户使用传统项目.待微服务稳定.无bug后全部用户迁移至微服务系统. 以上为背景,实现此方案使用 ...

  2. nginx+lua+redis实现降级

    前言 商城或web站点的用户访问量出乎意料地增加了很多,超出了系统的负载能力, 系统有些扛不住,继而导致注 册,下单,支付什么的全部在绕圈卡住,继而导致公司业务损失了不少用户和订单.. 一.引子 面对 ...

  3. nginx lua redis 访问频率限制(转)

    1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...

  4. Nginx+lua 实现调用.so文件方法

    本文给大家分享的是Nginx结合lua 实现调用.so动态链接库文件的方法和示例,有需要的小伙伴可以参考下 最近在和智能硬件部门一起,做一个室内定位的服务,该服务根据手机端传过来的beacon设备列表 ...

  5. windows下nginx+lua+redis实现短域名服务

    nginx+lua+redis 环境搭建: 我使用的是大牛 ZhangYichun 提供的集成包快速安装. 非常简单,下载 ngx_openresty,该集成包中有:Nginx,Lua或Luajit, ...

  6. 【经验】使用Nginx对kiftd进行反向代理和域名绑定

    本文将向您演示如何通过Nginx对kiftd进行反向代理和域名绑定,从而让访问者能够通过指定的域名来访问kiftd或是您的其他网站页面.尤其是对于需要在同一台服务器上部署多个网站项目和kiftd的用户 ...

  7. 运维之道 | Nginx负载均衡、反向代理

    Nginx负载均衡.反向代理 一.代理服务器 1.什么是代理服务器? 客户端访问数据的时候,不会直接与目标服务器进行连接,而是所有的请求都发送到代理(Proxy)服务器,然后代理服务器会去根据你的请求 ...

  8. Nginx学习3:反向代理实例

    Nginx配置实例-反向代理1 目标 打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页面中 准备工作 我们在官网下载好tomcat之后,直接将t ...

  9. Nginx-05:Nginx配置实例之反向代理2

    Nginx配置实例之反向代理 目的:使用nginx反向代理,根据访问的路径跳转到不同端口的服务器中,nginx监听端口为9001. 访问http://192.168.17.129:9001/edu/ ...

最新文章

  1. autowired java_Java 基础之Autowired 是否是自动注入
  2. 深度学习手势识别带你玩转神庙逃亡
  3. string转object对象_025:听闻你精通面向对象,来解决一下
  4. KEIL-MDK编译错误问题解决办法
  5. Python并发编程之多进程(一)
  6. mysqldump导出数据库 (dos环境下)
  7. mate7安装android o,华为Mate7升级安卓6.0详细教程
  8. python api测试框架_python api 测试框架
  9. java中HashSet对象内的元素的hashCode值不能变化
  10. Burpsuite工具使用
  11. 开课吧:浅析人工智能对网络安全格局的影响
  12. (一)Quartz2.2.1 简单例子
  13. 【专栏必读】王道考研408操作系统+Linux系统编程万字笔记、题目题型总结、注意事项、目录导航和思维导图
  14. 拆解iPhone6S---ESM
  15. 超级计算机中心建设方案,超算中心建设框架
  16. 熬秃了头整理的网络工程师学习笔记和心得:传闻中的OSPF到底是什么
  17. linux编程 —— shell编程脚本常用语法总结 【学习笔记】
  18. 计算机人文素养教案,谈谈信息技术课堂中人文素养培养的感想和体会
  19. [转帖]LNMP组件安装
  20. machine learning : 最小二乘法之线性函数 --- python实现

热门文章

  1. quarts集群 运维_Quartz.Net分布式运用
  2. python面试题及答案 2019-这些2019年常考的Python面试题你都能答上来吗?
  3. mysql 存储过程游标 循环输出select 查询结果
  4. 研究生开学需要准备的事宜(准研究生和保研必看)
  5. JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度
  6. mysql search yum_mysql的yum安装与配置
  7. 长春技师学院计算机系,长春技校排名前五十
  8. jsonready onload 与_漫谈JSONP以及img的onLoad和onEr
  9. layer 一张表按钮根据一个id 查询相关信息
  10. linux中dir命令,详解Linux系统中ls和dir命令的组合使用