资讯专栏INFORMATION COLUMN

openResty IP数据库

nodejh / 2551人阅读

摘要:数据库数据库之版,为了方便使用数据所封装的拓展包。使用方式本脚本封装了的主要接口配制好后就可以直接使用,并不需要再去复杂的内部实现。同样希望这个脚本能提供给官方推荐脚本。

openResty IP数据库

ipip.net IP数据库之openresty版,为了方便nginx使用ip 数据所封装的拓展包。

使用方式

本脚本封装了ipip.net的主要接口配制好后就可以直接使用,并不需要再去复杂的内部实现。

需要注意的是如果使用api访问需要http拓展包。

代码我已提交至GitHub: https://github.com/icowan/lua-resty-17mon

如果对lua不了解请看我前段时间写的: 《Lua基础学习方式 (一天学会) 》

如果还没安装openresty请看: 《优雅的安装openresty 》

`

nginx 配制

要使用首先得载入自己写义的lualib,这个根据你安装的或使用方式去修改路径。

lua_package_path "/usr/local/openresty/lualib/?.lua;/var/www/lua-resty-17mon/lualib/?.lua;;";
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";

error_log /var/www/lua-resty-17mon/logs/lua-resty-17mon.debug.log debug;

server {
    listen 8080;
    server_name localhost;
    charset utf-8;
    location /ipLocation {
        resolver 8.8.8.8; # 如果要使用api的话 需要dns 这可以改成中国的会快一些
        default_type "text/plain";
        content_by_lua_file "/var/www/lua-resty-17mon/script/ip_location.lua";
    }
}
lua 脚本使用
-- /var/www/lua-resty-17mon/script/ip_location.lua

ngx.req.read_body()
ngx.header.content_type = "application/json;charset=UTF-8"

local cjson = require "cjson"

local success = function(con)
    return cjson.encode({
        success = true,
        body = con
    })
end

local failure = function(err)
    return cjson.encode({
        success = false,
        errors = err
    })
end

-- 参数获取
local request_args = ngx.req.get_uri_args()
local ip_address = request_args["ip"]

-- 如果不需要验证可以不用此拓展
local checkIp = require("ip_check"):new(ip_address)

-- 验证ip
local ok, err = checkIp:checkIp()
if not ok then
    ngx.say(failure(err))
    return
end

-- 使用本地数据库
local ipdetail, err = require("ip_location"):new(ip_address, "/var/www/lua-resty-17mon/file/17monipdb.dat")
if not ipdetail then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

local ipLocation, err = ipdetail:location()
if not ipLocation then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

ngx.say(success(ipLocation))
通过免费api获取ip信息

如果通过api获取数据需要使用http服务,这里需要使用lua-resty-http
这里我已经把它直接放到lualib/resty目录了,可以直接使用 感谢pintsized提供的脚本

-- /var/www/lua-resty-17mon/script/ip_location.lua

local ipdetail, err = require("ip_location"):new(ip_address)
if not ipdetail then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

local ipLocation, err = ipdetail:locationApiFree()
if not ipLocation then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

ngx.say(success(ipLocation))
通过付费api获取ip信息
-- /var/www/lua-resty-17mon/script/ip_location.lua

local ipdetail, err = require("ip_location"):new(ip_address, "", "your token")
if not ipdetail then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

local ipLocation, err = ipdetail:locationApiFree()
if not ipLocation then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

ngx.say(success(ipLocation))
获取aip使用状态
-- /var/www/lua-resty-17mon/script/ip_location.lua

local ipdetail, err = require("ip_location"):new(ip_address, "your token")
if not ipdetail then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

local ipLocation, err = ipdetail:apiStatus()
if not ipLocation then
    ngx.log(ngx.ERR, err)
    ngx.say(failure(err))
    return
end

ngx.say(success(ipLocation))
返回数据结构

Response

返回类型: JSON

参数 类型 备注
success bool true or false
errors or body string 当success为false时errors有值否则返回body

body返回参数详情

参数 类型 备注
country string 国家
city string 省会或直辖市(国内)
region string 地区或城市 (国内)
place string 学校或单位 (国内)
operator string 运营商字段
latitude string 纬度
longitude string 经度
timeZone string 时区一, 可能不存在
timeZoneCode string 时区码
administrativeAreaCode string 中国行政区划代码
internationalPhoneCode string 国际电话代码
countryTwoDigitCode string 国家二位代码
worldContinentCode string 世界大洲代码

返回结果参考:

{
    "success": true,
    "body": {
        "country": "",  // 国家
        "city": "",  // 省会或直辖市(国内)
        "region": "",  // 地区或城市 (国内)
        "place": "",  // 学校或单位 (国内)
        "operator": "",  // 运营商字段(只有购买了带有运营商版本的数据库才会有)
        "latitude": "",  // 纬度     (每日版本提供)
        "longitude": "",  // 经度     (每日版本提供)
        "timeZone": "",  // 时区一, 可能不存在  (每日版本提供)
        "timeZoneCode": "",  // 时区码, 可能不存在  (每日版本提供)
        "administrativeAreaCode": "",  // 中国行政区划代码    (每日版本提供)
        "internationalPhoneCode": "",  // 国际电话代码        (每日版本提供)
        "countryTwoDigitCode": "",  // 国家二位代码        (每日版本提供)
        "worldContinentCode": ""  // 世界大洲代码        (每日版本提供)
    }
}

ERROR结果参考

{
    "success": false,
    "erros": "retun messages..."
}

查询状态结果参考

{
    "success": true,
    "body": {
        "limit": false, // 是否已受访问限制
       "hour": 99680,  // 一个小时内剩余次数
       "day": 999680,  // 24小时内剩余次数
    }
}
尾巴

难得为开源社区贡献一份力量,希望有同样需求的同学们可以不用再去写复杂的底层逻辑,应该更多的把时间估计业务流程上。

同样希望这个脚本能提供给ipip.net官方推荐脚本。

或访问我 网站: LatteCake

本文地址: http://lattecake.com/post/20102

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39376.html

相关文章

  • (学习到实践)七、mongodb测试,php+nginx负载均衡的部署

    摘要:运行容器意外的官方参考地址,多次尝试命令最终无法运行,带项时后是状态,修改配置没反应日志无报错退出。目前容器整体情况是主从,个相同一个。后续运行的容器数视情况而定。接下来计划针对,一些实际应用场景进行实践验证。 目标需求: 密码登录+容器数据共享,主从复制 1.配置启动 添加配置文件夹,组织容器命令。 a.官方未提供相关信息 从测试容器中匹配搜索得到 mongod.conf.orig,...

    fyber 评论0 收藏0
  • Mac下使用ABTestingGateway快速搭建灰度网关

    摘要:下使用快速搭建灰度网关简介是新浪开源的一个可以动态设置分流策略的灰度发布系统,工作在层,基于和开发,使用作为分流策略数据库,可以实现动态调度功能。目前在京东如实时价格秒杀动态服务单品页列表页等都在使用架构,其他公司如淘宝去哪儿网等。 Mac下使用ABTestingGateway快速搭建灰度网关 ABTestingGateway简介 ABTestingGateway 是新浪开源的一个可以...

    2bdenny 评论0 收藏0
  • 如何在云帮上配置https

    摘要:云帮所有的对外服务都配置在负载均衡上,都是通过负载均衡转发到对应的应用与服务。大概的操作流程如下那么接下来就说说如何具体去配置。测试即可,如果多节点配置直接配置就了。配置到这里,云帮已经配置完成了。 序 相关组件介绍 本次分享主要涉及到两个模块console模块和openresty模块。 console模块 即云帮(ACP)控制台模块,为用户提供可视化Web操作界面,监听443端口即可...

    马龙驹 评论0 收藏0
  • OpenrestyOpenresty增加waf配置

    摘要:说明防止注入,本地包含,部分溢出,测试,等攻击防止备份之类文件泄漏防止之类压力测试工具的攻击屏蔽常见的扫描黑客工具,扫描器屏蔽异常的网络请求屏蔽图片附件类目录执行权限防止上传下载使用使用安装下载解压后,将整放到目录中,并命名为配置安装路径假 1. Ngx lua waf 说明 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击防止svn/备份之类文件泄...

    iliyaku 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<