nginx 1.31.7: 標準の GeoIP モジュールで GeoIP2(.mmdb)が読めるようになった
これまで GeoLite2 を使うにはサードパーティのモジュールか NGINX Plus が必要だったが、1.31.7 からは標準の geoip_country / geoip_city に .mmdb を指定するだけで済む。
どんなときに使う?
- 国やリージョンでアクセスを振り分けたい・拒否したい(
mapと組み合わせる) - アクセスログに国コードや AS 組織名を出したい
- 旧形式の GeoIP Legacy(
.dat)をまだ使っている。こちらは 2022 年に提供終了し、データが古いまま
やり方
- nginx を 1.31.7 以上にする。ソースビルドなら
libmaxminddbを入れておくとconfigureが自動で MMDB 対応を有効にする(libGeoIPもあれば旧形式と両方読める) - MaxMind から GeoLite2 のデータベースを取得する(無料だがアカウント登録とライセンスキーが必要)
- 既存のディレクティブの向き先を
.mmdbに変える
nginx
http {
geoip_country /usr/share/GeoIP/GeoLite2-Country.mmdb;
geoip_city /usr/share/GeoIP/GeoLite2-City.mmdb;
# 例: 国コードでブロック
map $geoip_country_code $blocked_country {
default 0;
XX 1; # 対象の国コードに置き換える
}
log_format geo '$remote_addr $geoip_country_code $geoip_city "$request" $status';
server {
if ($blocked_country) { return 403; }
access_log /var/log/nginx/access.log geo;
}
}stream モジュール(TCP/UDP)でも同じように使える。
旧形式から移るときに変わる変数
$geoip_country_code3: MMDB は 2 文字コードしか持たないので、nginx が内蔵の ISO 3166-1 表から 3 文字コードを作る$geoip_org:autonomous_system_organization→isp→organization→domainの順に探す$geoip_region/$geoip_region_name: 最初の subdivision から取るので、旧データと値が変わることがある$geoip_dma_code: 空のことがある(元データが非推奨)$geoip_area_code: MMDB に対応する項目がなく、常に空
注意点
- コミュニティ版の
ngx_http_geoip2_moduleを使っているならそのままでもよい。標準モジュールはその設定や全機能の置き換えではない - データベースは定期的に更新が出る。
geoipupdateなどで自動更新し、更新後はnginx -s reload - 同じリリースで、バッファサイズに
0を指定した設定はエラーになり、上流の証明書を IP アドレスで検証する場合は IP アドレスの SAN が必須になった。上げる前にnginx -tで確認する - 1.31.7 は CVE 5 件の修正も含むので、GeoIP を使わなくても更新する価値がある
出典
- @matsuu · 2026-10-18
- NGINX Community Blog「NGINX 1.31.7: Native GeoIP2 support, HTTP/2 priorities, and QUIC improvements」: blog.nginx.org