Nginx需借助ngx_http_geoip2_module模块和GeoLite2数据库实现地理区域路由:先编译安装模块并配置数据库路径,再在http块中加载模块、定义地理变量及backend映射,最后在location中用proxy_pass动态指向对应upstream。

Nginx 本身不内置地理 IP 解析能力,要实现基于客户端地理位置的区域路由代理(例如:中国用户走 A 后端,美国用户走 B 后端),需借助第三方模块(如 ngx_http_geoip2_module)配合 GeoIP2 数据库,并在 proxy_pass 中使用变量动态选择 upstream。
1. 安装 GeoIP2 模块和数据库
官方 ngx_http_geoip2_module 替代已废弃的 geoip 模块,支持 MaxMind GeoLite2 格式:
- 编译 Nginx 时添加
--add-dynamic-module=/path/to/ngx_http_geoip2_module - 下载免费 GeoLite2 City 数据库(
GeoLite2-City.mmdb),放在服务器固定路径(如/usr/share/GeoIP/GeoLite2-City.mmdb) - 确保 Nginx 用户(如
www-data或nginx)有读取权限
2. 在 http 块中加载地理数据并定义变量
在 nginx.conf 的 http{} 块内配置:
load_module modules/ngx_http_geoip2_module.so;
<p>geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
$geoip2_data_country_code source=$remote_addr country iso_code;
$geoip2_data_continent_code source=$remote_addr continent code;
$geoip2_data_city_name source=$remote_addr city name;
}</p><h1>可选:为常用区域定义更简洁的映射变量</h1><p>map $geoip2_data_country_code $backend_group {
default "default";
CN "cn_backend";
US "us_backend";
JP "jp_backend";
KR "kr_backend";
}</p>
3. 配置 upstream 并在 location 中动态路由
定义多个后端组,再根据 $backend_group 变量选择目标:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
upstream cn_backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
<p>upstream us_backend {
server 10.0.2.20:8080;
server 10.0.2.21:8080;
}</p><p>upstream default {
server 10.0.3.30:8080;
}</p><p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;">location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 关键:动态 proxy_pass
proxy_pass http://$backend_group;
}}
4. 注意事项与验证方法
实际部署中需关注以下细节:
-
IP 来源准确性:若 Nginx 前有 CDN 或 LB,需用
real_ip_header和set_real_ip_from正确还原真实客户端 IP -
变量作用域:
proxy_pass中的变量仅在location级生效,不能在upstream内直接引用 -
性能影响:GeoIP2 查询开销小,但高频请求下建议开启共享内存缓存(模块支持
shared参数) -
调试技巧:临时加
add_header X-Country $geoip2_data_country_code;到响应头,用 curl 验证识别结果
不复杂但容易忽略:数据库需定期更新(MaxMind 每月发布新版),建议用脚本自动下载 + reload Nginx。










