NGINX 1.31.7 內建 GeoIP2 讀 MMDB,HTTP/2 改採 RFC 9218 優先權
nginx.org CHANGES · 2026-10-14
NGINX 的 GeoIP 模組終於能直接讀 MaxMind 新格式(MMDB),不必再裝第三方 GeoIP2 模組去繞過已停止維護的舊版 libGeoIP;同一版也把 HTTP/2 優先權從 RFC 7540 的依賴樹換成 RFC 9218。
這些改動都在 1.31.7(CHANGES 標示 2026-10-14 發布),同版另修五個 CVE。下面只深入討論最會影響升級的三件事。
背景:舊 GeoIP 模組卡在 EOL 格式
NGINX 內建的 ngx_http_geoip_module 與 ngx_stream_geoip_module 只能讀 MaxMind 的 GeoIP Legacy 資料庫,而 PR #1655 說明該格式在 2022 年已 EOL。想用 GeoLite2 的團隊只能另外編譯社群的 GeoIP2 模組,每次升級 NGINX 都要重編一次動態模組。
核心改動一:同樣的指令,改讀 MMDB
PR #1655 沒有新增模組,而是讓既有的 geoip_country、geoip_city、geoip_org 直接接受 MMDB 檔,變數名稱仍是 $geoip_*。多數情況只要換資料庫檔名:
# 舊:GeoIP Legacy
geoip_country /usr/share/GeoIP/GeoIP.dat;
# 新:GeoLite2 (MMDB)
geoip_country /usr/share/GeoIP/GeoLite2-Country.mmdb;
geoip_city /usr/share/GeoIP/GeoLite2-City.mmdb;編譯時,configure 只要偵測到 libmaxminddb 或 libGeoIP 其中之一就能建置,兩個都沒有則失敗;兩者並存時兩種格式都能用,方便分階段遷移。但它不是無痛替換,PR 列出的語意差異如下:
$geoip_country_code3、$geoip_city_country_code3:由內建的 ISO 3166-1 對照表從 alpha-2 轉出。$geoip_org:依序嘗試autonomous_system_organization、isp、organization、domain。$geoip_region、$geoip_region_name:取第一個 subdivision,值可能與舊資料庫不同。$geoip_dma_code:來自 MaxMind 已標示棄用的location.metro_code,可能為空。$geoip_area_code:MMDB 沒有對應欄位,永遠查不到。
PR 作者另外提醒:原地截斷(truncate)MMDB 檔可能讓 worker 以 SIGBUS 崩潰,更新資料庫請先寫暫存檔再 rename。
核心改動二:HTTP/2 優先權換成 RFC 9218
ngx_http_v2_module 現在使用 RFC 9218 的優先權機制,RFC 7540 的依賴樹與權重被整個移除,舊式優先權訊號只做框架檢查,其餘忽略(PR #1520)。這個模式沒有新指令,升級後自動啟用。
客戶端用 Priority 標頭或 PRIORITY_UPDATE 框架送出兩個參數:urgency u(0 到 7,預設 3,數字越小越急)與 i(可漸進處理)。排程順序是先看 urgency,再讓非漸進的先於漸進的,最後按請求順序。
Priority: u=1
Priority: u=5, i上游回應若帶 Priority 標頭,NGINX 會與客戶端訊號合併,兩邊都設同一參數時以回應端為準,但轉發給上游的請求標頭不會被改動。
PR 描述中的測試是在限速 50 Mbit/s 的 loopback 上同時下載兩個 10 MB 檔案、先請求 A 再請求 B:
| 情境 | B 完成時間 | A 完成時間 |
|---|---|---|
| 無優先權(預設 u=3) | 3.42 s | 2.56 s |
A u=5、B u=1 | 2.57 s | 3.42 s |
這是作者在 PR 中自己跑的單一情境,不是通用基準;PR 也坦承 RFC 9218 第 10 節對同 urgency 非漸進回應的嚴格循序傳輸並未強制。
影響範圍
用第三方 GeoIP2 模組的人可以評估改用內建版,但 release notes 明說社群模組仍可運作、原生版並非 drop-in。要檢查的是:設定檔裡有沒有用到 $geoip_area_code、$geoip_dma_code、$geoip_region、三碼國碼這些會變的變數,以及 build image 是否裝了 libmaxminddb 開發套件。
靠自訂 HTTP/2 依賴樹調優的人(例如對特定 CDN 前端的客戶端做權重設定)要知道這些訊號現在被忽略,行為改由客戶端送的 Priority 決定。
另外兩個升級相容性提醒來自 官方部落格的 Upgrade Notes:nginx -t 現在會拒絕緩衝區指令設成 0(含 client body/header、proxy、stream preread、HTTP/3 stream 等緩衝區),先改成非零值或刪掉;用 IP 驗證上游憑證者,IP 現在只會比對憑證的 IP SAN 項目,不再比對 DNS 名稱或 CN。
同版其他值得注意的事
quic_bpf 現在支援 reload 與 binary upgrade(PR #1756),但官方部落格說明 HTTP/3 與 QUIC 仍屬實驗性。安全面,1.31.7 修補 CVE-2026-15176(alias 搭配 rewrite 的緩衝區溢位)、CVE-2026-93479、CVE-2026-95101(HTTP/3 未知框架被當成請求本文,可繞過 client_max_body_size)、CVE-2026-97629(TLS session ticket 金鑰輪替時有一把金鑰未初始化)與 CVE-2026-97205(AIO 搭配 SSI 的 use-after-free),其中有跑 HTTP/3 或 ticket 輪替的站台應優先升級。