在 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 数据库

  1. 注册 MaxMind 账户:前往 MaxMind官网 注册账号。

  2. 下载 GeoIP2 数据库:你可以选择下载 GeoIP2 CityGeoIP2 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>")
            }
        }
    }
}
​

关键部分说明

  1. lua_package_path 用来加载 Lua 库,确保 OpenResty 能正确找到 lua-resty-geoip2 模块。

  2. geoip2:new() 加载了 MaxMind 的 .mmdb 数据库文件。

  3. db:city(ip) 通过客户端 IP 查找城市信息。

  4. ngx.var.remote_addr 获取客户端的 IP 地址。

  5. 使用 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