ngx_http_geoip2_module 支持洲际字段,需使用 GeoLite2-Country 或 City 数据库、Nginx ≥3.3 版并正确配置 $geoip2_continent_code 等变量,配合 map、limit_req、error_page 等实现按洲路由、限速或降级。

ngx_http_geoip2_module 本身不直接提供“洲际”(如亚洲、欧洲)维度的数据,它依赖 MaxMind GeoLite2 或 GeoIP2 数据库,而这些数据库原生字段中没有 continent_code 或 continent_name 的直接映射——但实际支持,只是需正确引用。
确认数据库与模块支持洲际字段
GeoLite2-Country 和 GeoLite2-City 数据库均包含 continent 对象,内含 code(如 "AS"、"EU")和 names(多语言名称)。需确保:
- 使用的是 GeoLite2-Country.mmdb 或更高版本(推荐 City 版本,兼容性更广)
- nginx 编译时启用了 --with-http_geoip2_module,且版本 ≥ 3.3(旧版可能缺失 continent 支持)
- 配置中通过
$geoip2_data_continent_code等变量引用(变量名由geoip2指令中的json_keys或默认路径决定)
定义洲际变量并用于条件路由
在 http 块中声明变量,映射大陆代码为可读标识或分组标签:
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
$geoip2_continent_code continent.code;
$geoip2_continent_name continent.names.en;
}
<p>map $geoip2_continent_code $target_upstream {
default upstream_default;
AS upstream_asia;
EU upstream_eu;
NA upstream_na;
SA upstream_sa;
OC upstream_oc;
AF upstream_af;
AN upstream_an; # 南极洲,极少用
}</p>
随后在 server 或 location 中使用:
proxy_pass http://$target_upstream;
基于洲际的精细化封禁策略
封禁不等于全站 return 403,更实用的是按洲设置速率限制、降级响应或跳转:
- 对非洲(AF)和南美(SA)IP 限速:用
limit_req配合 zone 定义,例如limit_req zone=af_limit burst=5 nodelay; - 对特定洲返回静态降级页:
if ($geoip2_continent_code = "AF") { rewrite ^(.*)$ /maintenance.html break; }(注意 if 在 location 中慎用,建议改用 map + error_page) - 配合 geo 指令做黑白名单增强:例如
geo $block_continent { default 0; AF 1; SA 1; },再用if ($block_continent) { return 403; }
验证与调试关键点
上线前必须验证变量是否真实生效:
- 添加临时 header 输出调试信息:
add_header X-Continent-Code $geoip2_continent_code;,curl 查看响应头 - 用已知洲际 IP(如东京、法兰克福、圣保罗节点)实测,避免仅靠本地 IP 测试(国内 IP 多为 AS,易误判)
- 注意 CDN 场景:若流量经 Cloudflare、阿里云全站加速等,需确保
real_ip_header和set_real_ip_from正确配置,否则取到的是 CDN 节点 IP(多属北美)










