Pular para conteúdo

maxminddb: Uma biblioteca Lua para leitura do banco de dados de geolocalização da MaxMind

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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 com o NGINX, certifique-se de que o nginx-module-lua está instalado.

Este documento descreve o lua-resty-maxminddb v1.3.7 lançado em 08 de dezembro de 2025.


Nota - [maxmind/libmaxminddb][]

  • [openresty][]

  • [GeoLite2 Free Downloadable Databases][linkGeolite2FreeDownloadableDatabases]

  • [maxmind/geoipupdate][]

Novos Recursos

  • Suporte a Múltiplos Bancos de Dados: Inicialize e use vários bancos de dados da MaxMind simultaneamente
  • Seleção de Perfil: Escolha qual banco de dados consultar usando nomes de perfil
  • Fallback Automático: Usa o primeiro banco de dados disponível se nenhum perfil for especificado

Correções de Bugs

Referência da API

Funções: - geo.init(profiles): Inicializa bancos de dados com nomes de perfil e caminhos de arquivo - geo.lookup(ip, lookup_path, profile): Procura endereço IP, opcionalmente especifica perfil - geo.initted(): Verifica se os bancos de dados estão inicializados - geo.get_profiles(): Obtém lista de nomes de perfil disponíveis - geo.has_profile(profile): Verifica se um perfil específico existe

Desculpas por infração - https://github.com/anjia0532/lua-resty-maxminddb/issues/25

opm (instalação manual do libmaxminddb e download GeoLite2-City.mmdb)

a imagem docker openresty/openresty:alpine e apache/apisix:2.13.0-alpine precisam instalar perl libmaxminddb

por exemplo, apk --no-cache add perl libmaxminddb && ln -s /usr/lib/libmaxminddb.so.0 /usr/lib/libmaxminddb.so

opm get anjia0532/lua-resty-maxminddb

imagem docker openresty/openresty:alpine-fat

luarocks install lua-resty-maxminddb

a imagem docker openresty/openresty:alpine precisa instalar luarocks (ref https://github.com/openresty/docker-openresty/blob/master/alpine/Dockerfile.fat)

instalação especial apache/apisix:2.xx.0-alpine luarocks install lua-resty-maxminddb UNZIP=/usr/bin/unzip

por exemplo, apk --no-cache add perl alpine-sdk && luarocks install lua-resty-maxminddb UNZIP=/usr/bin/unzip

## Sinopse

**Uso Básico (Banco de Dados Único)**
```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")

Suporte a Múltiplos Bancos de Dados

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

-- Procura usando o perfil padrão (o primeiro)
local res, err = geo.lookup("8.8.8.8")

-- Ou especifique um 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")

Exemplo Completo do 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

            -- Procura usando o perfil padrão (o primeiro)
            local res,err = geo.lookup(ngx.var.arg_ip or ngx.var.remote_addr)

            -- Suporte a múltiplos bancos de dados
            -- 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,'falha ao procurar pelo ip, razão:',err)
            end
            ngx.say("full :",cjson.encode(res))
            if ngx.var.arg_node then
               ngx.say("nome do nó:",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"

  full :{"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"}}
  nome do nó:city ,valor:{"geoname_id":1799962,"names":{"en":"Nanjing","ru":"Нанкин","fr":"Nankin","pt-BR":"Nanquim","zh-CN":"南京","es":"Nankín","de":"Nanjing","ja":"南京市"}}

prettify

full: {
    "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"
    }
}
nome do nó: city, valor: {
    "geoname_id": 1799962,
    "names": {
        "en": "Nanjing",
        "ru": "Нанкин",
        "fr": "Nankin",
        "pt-BR": "Nanquim",
        "zh-CN": "南京",
        "es": "Nankín",
        "de": "Nanjing",
        "ja": "南京市"
    }
}

Referências

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

Relatórios de Bugs

Por favor, relate bugs abrindo uma issue em nosso rastreador de issues do GitHub em https://github.com/anjia0532/lua-resty-maxminddb/issues

Se o bug for causado pelo libmaxminddb, relate no rastreador em https://github.com/maxmind/libmaxminddb/issues

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-maxminddb.