GeoIP: support for the MaxMind DB (MMDB) databases

The MaxMind DB format is now recognized, with the fallback to the
legacy format (reached End-of-Life in May 2022).  Migration requires
switching to MMDB database files:

    geoip_country  /usr/share/GeoIP/GeoLite2-Country.mmdb;
    geoip_city     /usr/share/GeoIP/GeoLite2-City.mmdb;
    geoip_org      /usr/share/GeoIP/GeoLite2-ASN.mmdb;

Either libmaxminddb or libGeoIP is sufficient to build the modules;
configure fails if neither is found.

Notes on the MMDB lookups:

*) $geoip_country_code3 and $geoip_city_country_code3 are converted from
   the alpha-2 codes with a compiled-in ISO 3166-1 table, as the MMDB
   databases provide alpha-2 codes only.

*) $geoip_org looks up "autonomous_system_organization", "isp",
   "organization", and "domain" in turn, to match the legacy ASNum, ISP,
   Org, and Domain database editions.

*) $geoip_area_code has no MMDB counterpart and is never found.

*) $geoip_region and $geoip_region_name come from subdivisions[0], and
   thus may differ in value from the legacy ones.

*) $geoip_dma_code comes from location.metro_code, which is deprecated
   by MaxMind and may be absent.

Co-authored-by: Nitin Swami <n.swami@f5.com>
This commit is contained in:
Sergey KandaurovandNitin Swami authored and Sergey Kandaurov committed 2026-09-30 20:17:54 +04:00
1 parent d30f68d82a
commit 2b5c2b605b
3 files changed
+1905 -61

No files matched your search

+105 -3
View File
@@ -3,8 +3,11 @@
# Copyright (C) Nginx, Inc.
GEOIP=NO
ngx_feature="GeoIP library"
ngx_feature_name=
ngx_feature_name=NGX_HAVE_GEOIP
ngx_feature_run=no
ngx_feature_incs="#include <GeoIP.h>"
ngx_feature_path=
@@ -83,6 +86,8 @@ fi
if [ $ngx_found = yes ]; then
GEOIP=YES
CORE_INCS="$CORE_INCS $ngx_feature_path"
if [ $USE_GEOIP = YES ]; then
@@ -101,11 +106,108 @@ if [ $ngx_found = yes ]; then
ngx_feature_test="printf(\"%d\", GEOIP_CITY_EDITION_REV0_V6);"
. auto/feature
else
fi
ngx_feature="MaxMind DB library"
ngx_feature_name=NGX_HAVE_MAXMINDDB
ngx_feature_run=no
ngx_feature_incs="#include <maxminddb.h>"
ngx_feature_path=
ngx_feature_libs="-lmaxminddb"
ngx_feature_test="MMDB_s mmdb; MMDB_open(NULL, MMDB_MODE_MMAP, &mmdb)"
. auto/feature
if [ $ngx_found = no ]; then
# FreeBSD port
ngx_feature="MaxMind DB library in /usr/local/"
ngx_feature_path="/usr/local/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lmaxminddb"
else
ngx_feature_libs="-L/usr/local/lib -lmaxminddb"
fi
. auto/feature
fi
if [ $ngx_found = no ]; then
# NetBSD port
ngx_feature="MaxMind DB library in /usr/pkg/"
ngx_feature_path="/usr/pkg/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lmaxminddb"
else
ngx_feature_libs="-L/usr/pkg/lib -lmaxminddb"
fi
. auto/feature
fi
if [ $ngx_found = no ]; then
# MacPorts
ngx_feature="MaxMind DB library in /opt/local/"
ngx_feature_path="/opt/local/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lmaxminddb"
else
ngx_feature_libs="-L/opt/local/lib -lmaxminddb"
fi
. auto/feature
fi
if [ $ngx_found = no ]; then
# Homebrew on Apple Silicon
ngx_feature="MaxMind DB library in /opt/homebrew/"
ngx_feature_path="/opt/homebrew/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lmaxminddb"
else
ngx_feature_libs="-L/opt/homebrew/lib -lmaxminddb"
fi
. auto/feature
fi
if [ $ngx_found = yes ]; then
GEOIP=YES
CORE_INCS="$CORE_INCS $ngx_feature_path"
if [ $USE_GEOIP = YES ]; then
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
fi
NGX_LIB_GEOIP="$NGX_LIB_GEOIP $ngx_feature_libs"
fi
if [ $GEOIP != YES ]; then
cat << END
$0: error: the GeoIP module requires the GeoIP library.
$0: error: the GeoIP module requires the MaxMind DB library
or the legacy GeoIP library.
You can either do not enable the module or install the library.
END
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff