テック技報最新号へ →
インフラ

nginx 1.31.7: 標準の GeoIP モジュールで GeoIP2(.mmdb)が読めるようになった

これまで GeoLite2 を使うにはサードパーティのモジュールか NGINX Plus が必要だったが、1.31.7 からは標準の geoip_country / geoip_city に .mmdb を指定するだけで済む。

@matsuu · 2026-10-19
#infra#nginx#geoip#maxmind#logging

どんなときに使う?

  • 国やリージョンでアクセスを振り分けたい・拒否したい(map と組み合わせる)
  • アクセスログに国コードや AS 組織名を出したい
  • 旧形式の GeoIP Legacy(.dat)をまだ使っている。こちらは 2022 年に提供終了し、データが古いまま

やり方

  1. nginx を 1.31.7 以上にする。ソースビルドなら libmaxminddb を入れておくと configure が自動で MMDB 対応を有効にする(libGeoIP もあれば旧形式と両方読める)
  2. MaxMind から GeoLite2 のデータベースを取得する(無料だがアカウント登録とライセンスキーが必要)
  3. 既存のディレクティブの向き先を .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 を使わなくても更新する価値がある

出典

X の元の投稿を開く