前言

最近因为工作需要,要进行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 '';
rewrite_by_lua_file /home/work/tengine-2.1.0/conf/lua/ivr.lua;
proxy_pass http://$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_uri
local callid = nil
local channel = 0
if string.find(uri, 'yuntongxun') then
callid = args["callid"]
channel = 0
elseif 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 = 1
elseif string.find(uri, 'huawei') then
callid = args["vSessionsId"]
channel = 2
else
end
if callid == nil then
ngx.say(uri)
ngx.say(cjson.encode(args))
ngx.say('callid is empty')
return ''
end
local key = callid .. '_channel' .. channel
local res = cache:get(key)
if res == ngx.null then
ngx.say("cache get error")
return ''
end
ngx.var.backend = res
没啥特别的, 针对多个IVR服务商, 进行解析callid, 然后拼成一个key, 去redis中查询整个key当时写入的value(开发者域名),
最后设置backend整个参数, 然后由nginx进行proxy_pass就完了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# nginx反向代理redis
# nginx
# lua
# 反向代理
# redis
# Nginx利用Lua+Redis实现动态封禁IP的方法
# Nginx+Lua+Redis构建高并发Web应用
# nginx+lua+redis防刷和限流的实现
# 多家
# 回调
# 以太
# 重构
# 是在
# 多个
# 则是
# 我们现在
# 又不
# 这篇文章
# 报错
# 谢谢大家
# 重启
# 不加
# 三家
# 接了
# 没啥
# 就可以
# 搞定了
# 新建一个
相关文章:
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
利用JavaScript实现拖拽改变元素大小
如何在新浪SAE免费搭建个人博客?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
建站主机选购指南与交易推荐:核心配置解析
贸易公司网站制作流程,出口贸易网站设计怎么做?
建站之星安装后如何配置SEO及设计样式?
如何快速配置高效服务器建站软件?
如何自定义建站之星网站的导航菜单样式?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
电商网站制作公司有哪些,1688网是什么意思?
建站上市公司网站建设方案与SEO优化服务定制指南
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何选择高效可靠的多用户建站源码资源?
如何快速打造个性化非模板自助建站?
C++如何使用std::optional?(处理可选值)
b2c电商网站制作流程,b2c水平综合的电商平台?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
javascript中的try catch异常捕获机制用法分析
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何快速搭建自助建站会员专属系统?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
建站之星云端配置指南:模板选择与SEO优化一键生成
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
深圳网站制作案例,网页的相关名词有哪些?
香港服务器部署网站为何提示未备案?
如何快速辨别茅台真假?关键步骤解析
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
北京企业网站设计制作公司,北京铁路集团官方网站?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
在线教育网站制作平台,山西立德教育官网?
,网页ppt怎么弄成自己的ppt?
如何通过远程VPS快速搭建个人网站?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
黑客入侵网站服务器的常见手法有哪些?
实例解析Array和String方法
Python如何创建带属性的XML节点
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
建站与域名管理如何高效结合?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
简历在线制作网站免费,免费下载个人简历的网站是哪些?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
建站之星CMS五站合一模板配置与SEO优化指南
如何快速搭建支持数据库操作的智能建站平台?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
智能起名网站制作软件有哪些,制作logo的软件?
*请认真填写需求信息,我们会在24小时内与您取得联系。