利用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_nameivr.com; access_log/home/work/log/nginx/access.ivr.log; error_log/home/work/log/nginx/error.ivr.log; proxy_set_headerHost$http_host; proxy_set_headerX-Forwarded-Port$server_port; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-Forwarded-Proto$scheme; proxy_set_headerX-Forwarded-Protocol$scheme; proxy_set_headerX-Real-IP$remote_addr; proxy_read_timeout30; proxy_connect_timeout10; location/ivr/{ lua_code_cacheoff; resolver8.8.8.8; set$backend''; rewrite_by_lua_file/home/work/tengine-2.1.0/conf/lua/ivr.lua; proxy_passhttp://$backend; } }
不加resolver的话可能会报错,无法解析,加一个8.8.8.8就可以搞定了。
lua_code_cache是开发环境的配置,不缓存lua代码,修改完lua直接生效,不然每次要重启nginx,上生产环境要关掉,严重影响性能。
不过我们这个需求主要是针对开发环境,所以无所谓。
lua代码
localredis=require"resty.redis" localcjson=require"cjson" localcache=redis.new() cache.connect(cache,'127.0.0.1','6379') localargs=ngx.req.get_uri_args() localuri=ngx.var.request_uri localcallid=nil localchannel=0 ifstring.find(uri,'yuntongxun')then callid=args["callid"] channel=0 elseifstring.find(uri,'yunhu')then ngx.req.read_body() localbody_data=ngx.req.get_body_data() localdata=cjson.decode(body_data) callid=data['call_id'] channel=1 elseifstring.find(uri,'huawei')then callid=args["vSessionsId"] channel=2 else end ifcallid==nilthen ngx.say(uri) ngx.say(cjson.encode(args)) ngx.say('callidisempty') return'' end localkey=callid..'_channel'..channel localres=cache:get(key) ifres==ngx.nullthen ngx.say("cachegeterror") return'' end ngx.var.backend=res
没啥特别的,针对多个IVR服务商,进行解析callid,然后拼成一个key,去redis中查询整个key当时写入的value(开发者域名),
最后设置backend整个参数,然后由nginx进行proxy_pass就完了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。