Saltar a contenido

maxminddb: Una biblioteca Lua para leer la base de datos de geolocalización de MaxMind

Instalación

Si no has configurado la suscripción al repositorio RPM, regístrate. Luego, puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-maxminddb

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-maxminddb

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-maxminddb v1.3.7 lanzado el 08 de diciembre de 2025.


Nota - [maxmind/libmaxminddb][]

  • [openresty][]

  • [GeoLite2 Bases de Datos Descargables Gratis][linkGeolite2FreeDownloadableDatabases]

  • [maxmind/geoipupdate][]

Nuevas Características

  • Soporte para Múltiples Bases de Datos: Inicializa y utiliza múltiples bases de datos de MaxMind simultáneamente
  • Selección de Perfil: Elige qué base de datos consultar usando nombres de perfil
  • Retroceso Automático: Utiliza la primera base de datos disponible si no se especifica un perfil

Errores corregidos

Referencia de API

Funciones: - geo.init(profiles): Inicializa bases de datos con nombres de perfil y rutas de archivo - geo.lookup(ip, lookup_path, profile): Busca la dirección IP, opcionalmente especifica el perfil - geo.initted(): Verifica si las bases de datos están inicializadas - geo.get_profiles(): Obtiene la lista de nombres de perfil disponibles - geo.has_profile(profile): Verifica si existe un perfil específico

Disculpa por la infracción - https://github.com/anjia0532/lua-resty-maxminddb/issues/25

opm (instalación manual de libmaxminddb y descarga de GeoLite2-City.mmdb)

openresty/openresty:alpine y apache/apisix:2.13.0-alpine necesitan instalar perl libmaxminddb

p. ej. apk --no-cache add perl libmaxminddb && ln -s /usr/lib/libmaxminddb.so.0 /usr/lib/libmaxminddb.so

opm get anjia0532/lua-resty-maxminddb

imagen docker openresty/openresty:alpine-fat

luarocks install lua-resty-maxminddb

imagen docker openresty/openresty:alpine necesita instalar luarocks (ref https://github.com/openresty/docker-openresty/blob/master/alpine/Dockerfile.fat)

instalación especial apache/apisix:2.xx.0-alpine luarocks install lua-resty-maxminddb UNZIP=/usr/bin/unzip

p. ej. apk --no-cache add perl alpine-sdk && luarocks install lua-resty-maxminddb UNZIP=/usr/bin/unzip

## Sinopsis

**Uso Básico (Base de Datos Única)**
```lua
local geo = require 'resty.maxminddb'
if not geo.initted() then
    geo.init("/path/to/GeoLite2-City.mmdb")
end
local res, err = geo.lookup("8.8.8.8")

Soporte para Múltiples Bases de Datos

local geo = require 'resty.maxminddb'
if not geo.initted() then
    geo.init({
        city = "/path/to/GeoLite2-City.mmdb",
        country = "/path/to/GeoLite2-Country.mmdb",
        asn = "/path/to/GeoLite2-ASN.mmdb"
    })
end

-- Búsqueda usando el perfil predeterminado (el primero)
local res, err = geo.lookup("8.8.8.8")

-- O especifica un perfil específico
local city_data, err = geo.lookup("8.8.8.8", nil, "city")
local country_data, err = geo.lookup("8.8.8.8", nil, "country")
local asn_data, err = geo.lookup("8.8.8.8", nil, "asn")

Ejemplo Completo de Nginx

server {
    listen 80;
    server_name localhost;
    location / {
        content_by_lua_block{
            local cjson = require 'cjson'
            local geo = require 'resty.maxminddb'
            if not geo.initted() then
                geo.init({
                    city = "/path/to/GeoLite2-City.mmdb",
                    country = "/path/to/GeoLite2-Country.mmdb"
                })
            end

            -- Búsqueda usando el perfil predeterminado (el primero)
            local res,err = geo.lookup(ngx.var.arg_ip or ngx.var.remote_addr)

            -- Soporte para múltiples bases de datos
            -- local res,err = geo.lookup(ngx.var.arg_ip or ngx.var.remote_addr, nil, ngx.var.arg_type or 'city')

            if not res then
                ngx.log(ngx.ERR,'falló la búsqueda por ip, razón:',err)
            end
            ngx.say("completo :",cjson.encode(res))
            if ngx.var.arg_node then
               ngx.say("nombre del nodo:",ngx.var.arg_node," ,valor:", cjson.encode(res[ngx.var.arg_node] or {}))
            end
        }
    }
}

  #ipv4
  $ curl "http://localhost/?ip=114.114.114.114&node=city&type=city"

  #ipv6
  #$ curl "http://localhost/?ip=2001:4860:0:1001::3004:ef68&node=country"

  completo :{"city":{"geoname_id":1799962,"names":{"en":"Nanjing","ru":"Нанкин","fr":"Nankin","pt-BR":"Nanquim","zh-CN":"南京","es":"Nankín","de":"Nanjing","ja":"南京市"}},"subdivisions":[{"geoname_id":1806260,"names":{"en":"Jiangsu","fr":"Province de Jiangsu","zh-CN":"江苏省"},"iso_code":"32"}],"country":{"geoname_id":1814991,"names":{"en":"China","ru":"Китай","fr":"Chine","pt-BR":"China","zh-CN":"中国","es":"China","de":"China","ja":"中国"},"iso_code":"CN"},"registered_country":{"geoname_id":1814991,"names":{"en":"China","ru":"Китай","fr":"Chine","pt-BR":"China","zh-CN":"中国","es":"China","de":"China","ja":"中国"},"iso_code":"CN"},"location":{"time_zone":"Asia\/Shanghai","longitude":118.7778,"accuracy_radius":50,"latitude":32.0617},"continent":{"geoname_id":6255147,"names":{"en":"Asia","ru":"Азия","fr":"Asie","pt-BR":"Ásia","zh-CN":"亚洲","es":"Asia","de":"Asien","ja":"アジア"},"code":"AS"}}
  nombre del nodo:city ,valor:{"geoname_id":1799962,"names":{"en":"Nanjing","ru":"Нанкин","fr":"Nankin","pt-BR":"Nanquim","zh-CN":"南京","es":"Nankín","de":"Nanjing","ja":"南京市"}}

prettify

completo: {
    "city": {
        "geoname_id": 1799962,
        "names": {
            "en": "Nanjing",
            "ru": "Нанкин",
            "fr": "Nankin",
            "pt-BR": "Nanquim",
            "zh-CN": "南京",
            "es": "Nankín",
            "de": "Nanjing",
            "ja": "南京市"
        }
    },
    "subdivisions": [{
            "geoname_id": 1806260,
            "names": {
                "en": "Jiangsu",
                "fr": "Province de Jiangsu",
                "zh-CN": "江苏省"
            },
            "iso_code": "32"
        }
    ],
    "country": {
        "geoname_id": 1814991,
        "names": {
            "en": "China",
            "ru": "Китай",
            "fr": "Chine",
            "pt-BR": "China",
            "zh-CN": "中国",
            "es": "China",
            "de": "China",
            "ja": "中国"
        },
        "iso_code": "CN"
    },
    "registered_country": {
        "geoname_id": 1814991,
        "names": {
            "en": "China",
            "ru": "Китай",
            "fr": "Chine",
            "pt-BR": "China",
            "zh-CN": "中国",
            "es": "China",
            "de": "China",
            "ja": "中国"
        },
        "iso_code": "CN"
    },
    "location": {
        "time_zone": "Asia\/Shanghai",
        "longitude": 118.7778,
        "accuracy_radius": 50,
        "latitude": 32.0617
    },
    "continent": {
        "geoname_id": 6255147,
        "names": {
            "en": "Asia",
            "ru": "Азия",
            "fr": "Asie",
            "pt-BR": "Ásia",
            "zh-CN": "亚洲",
            "es": "Asia",
            "de": "Asien",
            "ja": "アジア"
        },
        "code": "AS"
    }
}
nombre del nodo: city, valor: {
    "geoname_id": 1799962,
    "names": {
        "en": "Nanjing",
        "ru": "Нанкин",
        "fr": "Nankin",
        "pt-BR": "Nanquim",
        "zh-CN": "南京",
        "es": "Nankín",
        "de": "Nanjing",
        "ja": "南京市"
    }
}

Referencias

  • [GeoIP2 City and Country CSV Databases][linkGeoip2CityAndCountryCsvDatabases]
  • [lilien1010/lua-resty-maxminddb][]
  • [maxmind/libmaxminddb#source#lookup_and_print][]
  • [maxmind/libmaxminddb#source#dump_entry_data_list][]

Informes de Errores

Por favor, informa errores presentando un problema en nuestro rastreador de problemas de GitHub en https://github.com/anjia0532/lua-resty-maxminddb/issues

Si el error es causado por libmaxminddb, informa en el rastreador en https://github.com/maxmind/libmaxminddb/issues

GitHub

Puedes encontrar consejos adicionales de configuración y documentación para este módulo en el repositorio de GitHub para nginx-module-maxminddb.