码迷,mamicode.com
首页 > 其他好文 > 详细

一种轻量的openresty路由设计

时间:2015-08-27 12:59:43      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

在使用openresty开发接口的过程会发现一个问题,那就是接口的地址问题怎么解决,最好一个接口地址对应一个lua文件,也可以在nginx.conf 配置中使用content_by_lua 来编写接口逻辑,显然后者并不合适团队开发,为了解决这个问题,所以出现了很多类似的框架,一个比较好用的就是lusty框架,他可以将url中的某段值自动定义成变量,但是耦合性有点高,当多个接口站点部署在同一个nginx上时,你只能通过修改lusty的目录结构和app.lua文件,显然这不是我想要的结果,在网上找到一段很犀利的ngx配置,简单粗暴,但非常有效。

 

技术分享

但出于安全性考虑,决定给访问的接口地址加个白名单功能,不在白名单的地址不允许访问。

将白名单功能抽象成一个app_route.lua文件,在初始化的时候需要载入一个白名单列表,具体的ngx配置如下:

技术分享

这里加载了一个对应目录的route_config.lua,由于这个config文件内容较小,所以我把内容直接列了出来:

--白名单列表
local whitelist = {
    test1,
    user/login,
    user/register
}
--路由重写列表
local rewritelist = {
    [user/([-_a-zA-Z0-9]+)/login] = user/login,
    [user/([a-zA-Z0-9]+)/register] = user/register
}
return {
    whitelist = whitelist,
    rewritelist = rewritelist
}

然后在content_by_lua_file 前面加这么一句代码:

技术分享

你会发现白名单功能就这么完成了,而且多次测试后发现单纯的路由查找功能会比lusty快一倍以上。

当然也支持简单的路由重定向功能,本文只是单纯的技术分享,如果你有更好的建议也可以单独讨论。

文本是原创作品,转载记得写明出处

app_route.lua

 1 local _M = { _VERSION = 0.1 }
 2 local mt = { __index = _M}
 3 local tinsert = table.insert
 4 local tconcat = table.concat
 5 local tonumber = tonumber
 6 local function uritoken(uri)
 7     local ret = {}
 8     for token in uri:gmatch("[^/.]+") do
 9         tinsert(ret,token)
10     end
11     return ret
12 end
13 
14 function _M.new(self,rconfig)
15     local tab = {}
16     local routeMap = require(rconfig)
17     local route_data = {}
18     local whitelist = routeMap.whitelist
19     for i=1,#whitelist do
20         local ret = uritoken(whitelist[i])
21         if #ret > 0 then
22             tinsert(route_data,tconcat({^,tconcat(ret,/),$}))
23         end
24     end
25     local rewritelist = routeMap.rewritelist
26     local x = 1
27     local rewrite_data = {}
28     local rewrite_urls = {}
29     for k,v in pairs(rewritelist) do
30         tinsert(rewrite_data,tconcat({^(?<z,x,z>,k,)$}))
31         tinsert(rewrite_urls,v)
32         x = x + 1
33     end
34     tab.rewrite_urls = rewrite_urls
35     tab.rewrite_pattern = tconcat(rewrite_data,|)
36     tab.route_pattern = tconcat(route_data,|)
37     return setmetatable(tab, mt)
38 end
39 
40 function _M.route_verify(self)
41     local uri = ngx.var.api_path
42     local ret = uritoken(uri)
43     uri = tconcat(ret,/)
44     ngx.var.api_path = uri
45     local m = ngx.re.match(uri,self.route_pattern)
46     if m == nil then
47         m = ngx.re.match(uri,self.rewrite_pattern)
48         if m == nil then
49             ngx.exit(404)
50         else
51             local locant = ngx.re.match(next(m,#m), "^z(\\d+)z")
52             ngx.var.api_path = self.rewrite_urls[tonumber(locant[1])]
53         end
54     end
55 end
56 return _M

 

一种轻量的openresty路由设计

标签:

原文地址:http://www.cnblogs.com/sixclub/p/4762828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!