nginx geo模块仅生成ip地域变量,需配合map、limit_req_zone或proxy_pass实现限流或分发;geo定义ip归属(如$is_cn),map转换为策略键(如"cn"),再用于差异化限流或upstream路由,并确保real_ip配置准确。

NGINX 的 geo 模块本身不直接限流,也不做分发,它只负责根据客户端 IP 地址生成一个变量(比如 $geo_country 或 $is_china),后续需配合 map、limit_req_zone 或 proxy_pass 等指令才能实现“按 IP 地域限流”或“地域分发”。关键在于把 IP 归属信息转化为可参与逻辑判断的变量。
geo 指令定义地域变量
在 http 块中使用 geo 定义基础地域标识:
-
geo $is_cn { default 0; include geo-cn.conf; }—— 将中国公网 IP 段归为1,其余为0 - 确保
geo-cn.conf文件包含最新中国 IP 段(如从 APNIC 或 IPIP.net 获取),格式为每行一个 CIDR:1.0.1.0/24 1; -
geo只支持 IPv4/IPv6 网段匹配,不依赖外部数据库,轻量且高性能,适合静态区域划分
用 map 把 geo 结果转为策略键值
geo 输出的是数字,而限流/分发通常需要更灵活的键(如国家码、等级标签),用 map 做语义映射:
map $is_cn $rate_key { 1 "cn"; 0 "other"; }- 这样就把 IP 是否属中国,转换成了字符串键
"cn"或"other",可用于差异化限流 - 也可扩展:结合
$http_user_agent或$arg_uid构建复合键,例如"cn_vip"、"other_bot"
基于地域变量配置限流
用 limit_req_zone 绑定 map 后的键,实现不同地区不同速率:
limit_req_zone $rate_key zone=by_region:10m rate=20r/s;- 在
location中启用:limit_req zone=by_region burst=40 nodelay; - 效果:中国用户走
cn键,限速 20r/s;其他地区走other键,同样限速 20r/s;若想区别对待,可再加一行limit_req_zone $rate_key zone=cn_only:5m rate=50r/s;并在条件分支中单独调用
基于地域变量做 upstream 分发
将 $rate_key 或 $is_cn 直接用于 proxy_pass 路由:
- 先定义两组后端:
upstream backend_cn { server 10.0.1.10:8080; }和upstream backend_oversea { server 10.0.2.10:8080; } - 用
map映射分发目标:map $is_cn $upstream_backend { 1 backend_cn; 0 backend_oversea; } - 在
server中:location / { proxy_pass http://$upstream_backend; } - 注意:真实 IP 必须准确。若前有 CDN 或 LB,需配置
set_real_ip_from+real_ip_header X-Forwarded-For,否则$remote_addr是代理地址,geo判定失效











