OpenResty 配合 GeoIP2 实现地理位置查询
在 OpenResty 中使用 GeoIP2 进行地理位置查找,可以通过集成 MaxMind 的 GeoIP2 库来实现。以下是一个基本的配置和实现流程。
安装 lua-resty-geoip2
模块
首先,我们需要安装 OpenResty 的 Lua 库 lua-resty-geoip2
,它是与 MaxMind GeoIP2 数据库交互的 Lua 库。
使用 opm
工具安装 lua-resty-geoip2
模块:
opm install lua-resty-geoip2
下载 GeoIP2 数据库
注册 MaxMind 账户:前往 MaxMind官网 注册账号。
下载 GeoIP2 数据库:你可以选择下载
GeoIP2 City
或GeoIP2 Country
数据库,文件通常为.mmdb
格式。
将下载的 .mmdb
文件(例如:GeoIP2-City.mmdb
)上传到服务器上合适的目录,建议将其放置在 OpenResty 的 nginx
目录下,例如:
mkdir -p /usr/local/openresty/nginx/geoip2
mv GeoLite2-City.mmdb /usr/local/openresty/nginx/geoip2/
配置 OpenResty 使用 GeoIP2
在 OpenResty 中配置 GeoIP2 查找功能时,修改 nginx.conf
文件。以下是一个简单的配置示例:
http {
# 加载 Lua 模块路径
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
server {
listen 4343;
location / {
content_by_lua_block {
-- 加载 lua-resty-geoip2 模块
local geoip2 = require "resty.geoip2"
-- 打开 GeoIP2 数据库
local db, err = geoip2:new("/usr/local/openresty/nginx/geoip2/GeoIP2-City.mmdb")
if not db then
ngx.say("failed to open GeoIP2 database: ", err)
return
end
-- 获取客户端的 IP 地址
local ip = ngx.var.remote_addr
-- 查找城市信息
local city, err = db:city(ip)
if not city then
ngx.say("failed to get city info: ", err)
return
end
-- 输出地理信息
ngx.say("Country: ", city.country.iso_code, "<br>")
ngx.say("City: ", city.city.name, "<br>")
ngx.say("Latitude: ", city.location.latitude, "<br>")
ngx.say("Longitude: ", city.location.longitude, "<br>")
}
}
}
}
关键部分说明:
lua_package_path
用来加载 Lua 库,确保 OpenResty 能正确找到lua-resty-geoip2
模块。geoip2:new()
加载了 MaxMind 的.mmdb
数据库文件。db:city(ip)
通过客户端 IP 查找城市信息。ngx.var.remote_addr
获取客户端的 IP 地址。使用
ngx.say
输出地理位置的相关信息,如国家代码、城市名称、经纬度等。
重启 OpenResty
配置完成后,重新加载或重启 OpenResty 服务使配置生效:
# 重启 OpenResty
sudo systemctl restart openresty
# 重新加载 OpenResty 配置
sudo openresty -s reload
测试
你可以通过浏览器或 curl
访问你的服务器来测试配置:
curl http://your-server-ip/
如果配置正确,你应该看到类似以下的输出:
Country: CN
City: Beijing
Latitude: 39.9042
Longitude: 116.4074