关于领导让我用Openresty实现的各种奇怪需求以及实现

2022-12-27 0 877

责任编辑主要如是说前段时间重新整理的用Openresty处置的许多市场需求或机能,总之这都是党委不时给我明确提出市场需求,很多市场需求总的来说却是别扭,但是党委不然不管怎么听并非?

有关Openresty网路上有许多如是说,他的一般用语和Nginx基本上那样无所谓不光的。高阶机能不然,Openresty比Nginx全力支持更多的组件,还全力支持lua、JavaScript做为JavaScript同时实现更高阶的机能。

市场需求一、URL改写

那个市场需求还算较为常用,是把两个url转化成另一类方式,举个范例:

党委:你来把https://www.example.com/article/xxxxx那个url给我转后端https://www.example.com/api/article/xxxxx两个USB上。 我:咋不间接允诺后端USB? 党委:/api/细看是后端USB,要让使用者看上去像间接出访两个网页。

那个小市场需求可以间接用rewrite同时实现,先看下rewrite的用语:

rewrite

用语: rewrite regex replacement [last|break|redirect|permanent]; 边线:server、location、if

当中最终两个组件:

last: 则表示在相匹配完前项准则后还会竭尽全力向上找其它location;break:则表示相匹配完前项准则后就间接回到;redirect:会回到302临时性链接,网页的门牌号会发生改变,食腐不能预览url。permanent:会回到301永久性链接,网页的门牌号会发生改变,食腐会预览url。

市场需求同时实现

我如果领到uri,即使后缀是那样的,因此只须要把uri前面的xxxxx导出出就好了,rewrite后,间接break。间接在server块里加之上面那块标识符,安安心心同时实现。

if ($uri ~* “^/article/(.*)”) { rewrite ^/article/(.*) /api/article/$1 break; } 市场需求二、URL改写+组件名切换

那个市场需求,跟上两个基本类型,只是多了两个组件转变的过程。

党委:你来把https://www.example.com/article/xxxxx?id=yyyyy那个url给我转后端https://www.example.com/api/article/xxxxx两个USB上,然后把id那个组件给我变成articleId。 我:间接用articleId不行吗? 党委:不行。

好吧,竭尽全力干活,那个市场需求可以分为两步,第一步把url用rewrite改写和上面的那样,第二步把组件换两个名字。

在nginx中可以使用$arg_nginx

市场需求同时实现

知道怎么领到组件后,同时实现就简单了,在第一示例的标识符基础上改改就可以了。

if ($uri ~* “^/article/(.*)”) { rewrite ^/article/(.*) /api/article/$1?articleId=$arg_id break; } 市场需求三、域名过滤

那个市场需求是说,服务器接收好多允诺,这些允诺有不同的域名,要过滤须要的域名允诺。

党委:咱们目前的服务器是别的组不用的,现在还有其它域名允诺会进来,你判断下如果是咱们的域名就竭尽全力执行,如果并非咱们的,间接回到404。 我:哦。

if AND OR 判断

那个市场需求理解是如果是A域名或者是B域名,允诺竭尽全力,如果都并非则回到404,但nginx虽然全力支持if判断,但是并不全力支持AND、 OR这样的操作,只能换一类方式同时实现。

同时实现思路为:我设置两个字符串,如果并非A域名我追加两个字符,如果并非B域名我再追加两个字符,如果那个字符串为等于一个值那么就回到404。

市场需求同时实现

刚才已经分析完了,间接上标识符吧,在server块里,加之上面那个标识符即可。

server { listen 80; server_name _; set $flag “n”; if ($host != a.example.com){ set $flag “${flag}o”; } if ($host != b.example.com){ set $flag “${flag}t”; } if ($flag = “not”){ return 404; } location / { … } } 市场需求四、配置CORS指定Origin

那个市场需求是跨域设置,不能设置为*,只允许特定的域名允诺,添加信任域名。

党委:给咱们网站USB设置下允许哪些域名可以出访。 我:你后端不能做吗? 党委:后端还不得写标识符吗。 我:。。。。。。

map指令

用语: map string $variable {…} 边线:http

那个map的含义简单理解为,map相匹配两个字符串做为key,按照映射关系把value的值赋值给$variable那个变量。

市场需求同时实现

既然不能用*设置允许所有跨域出访,只能定义两个白名单了,最终同时实现如下:

map $http_origin $allow_origin { ~https://a.example.com https://a.example.com; ~https://b.example.com https://b.example.com; default deny; } server { listen 80; server_name *.example.com; location / { add_header Access-Control-Allow-Origin $allow_origin; add_header Access-Control-Allow-Credentials true; … } } 市场需求五、组件值切换

这天党委又给我来了个震惊我的市场需求:把两个允诺的组件值按照一定的准则动态换成数据库里的另两个值。

党委:你看那个url,https://www.example.com/api/user/info?openId=xxxx,在Openresty中把那个openId给我换成数据库里的主键id,然后用id组件传给我,是变为https://www.example.com/api/user/info?id=yyyy。 我:你没开玩笑? 党委:我像在开玩笑吗?下午给我。

解决思路

既然没开玩笑,那就想办法呗。用Openresty连数据库?额,不太好。

从官网找了找,也没有找到好办法,那只能写个脚本了。

先判断是那个url,先内部发送个允诺根据openId查询对应id,再把id拼接到url竭尽全力处置后续逻辑。

市场需求同时实现

先写个lua脚本,从脚本中根据openId查询出对应id是多少,然后再把id组件拼接上,重新允诺USB。

相当于中间经过了一层中转,即使是服务内部允诺,因此性能影响并非很大,来看下标识符同时实现。

lua脚本 user_api.lua

— 判断标识,防止死循环 if ngx.var.arg_internal == internal then return end local open_id = ngx.var.arg_openId if open_id == nil then local result = {“success”: false,”code”: 1001,”msg”:”使用者不存在”} ngx.status = ngx.HTTP_OK ngx.say(result) ngx.exit(ngx.HTTP_OK) end — 根据openId查询 local resp = ngx.location.capture(“/api/third/user/info?openId=” .. open_id, { method = ngx.HTTP_GET, keepalive_timeout = 60, keepalive_pool = 100 }) if not resp or 200 ~= resp.status then local result = {“success”: false,”code”: 1002,”msg”:”允诺失败”} ngx.status = ngx.HTTP_OK ngx.say(result) ngx.exit(ngx.HTTP_OK) end local cjson = require “cjson” local user = cjson.decode(resp.body).data local id = user.id — 重新允诺,加之内部允诺标识 return ngx.exec(/api/user/info?internal=internal&id= .. id)

openresty配置如下,须要加之access_by_lua_file,对应的值为lua脚本的路径。

location /api/user { proxy_pass http://user_upstream;proxy_pass_header Date; proxy_pass_header Server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; access_by_lua_file /usr/local/openresty/lua_lib/user_api.lua; } 后记

这些都是党委明确提出的许多市场需求,你以为就这些吗?不不不,这只是冰山一角,后续会再如是说其它市场需求,和解决方案。

作者:JavaCub 链接:https://juejin.cn/post/717982491199
关于领导让我用Openresty实现的各种奇怪需求以及实现
打开网易新闻 查看精彩图片

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务