Apache虚拟主机需通过mod_maxminddb等第三方模块加载GeoLite2数据库,并配置mod_remoteip获取真实IP,再结合RewriteRule实现按国家码(如CN、US)代理分流,支持fallback默认集群,但仅限静态粗粒度调度。

Apache 虚拟主机本身不带 GeoIP 功能,必须通过第三方模块(如 mod_maxminddb 或 mod_geoip2)加载 MaxMind 地理数据库,并在虚拟主机配置中结合环境变量与重写规则,才能实现基于国家或省份的区域流量分发。
确保真实客户端 IP 可用
如果前端有 CDN、Nginx 或负载均衡器,%{REMOTE_ADDR} 默认是代理 IP。需启用 mod_remoteip 并在虚拟主机外(通常在主配置或全局模块段)设置:
- 加载模块:
LoadModule remoteip_module modules/mod_remoteip.so - 指定传递真实 IP 的请求头,常见为
X-Forwarded-For:RemoteIPHeader X-Forwarded-For - 列出可信内网/代理段,防止伪造:
RemoteIPTrustedProxy 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
配置后,%{REMOTE_ADDR} 和后续 GeoIP 模块读取的 IP 才是用户真实出口 IP。
在虚拟主机中加载并启用 GeoIP 模块
以推荐的 mod_maxminddb(适配 GeoLite2)为例,模块加载一般在全局配置,但数据库路径和变量映射可限定在虚拟主机内:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用模块解析:
MaxMindDBEnable On - 绑定数据库文件(需提前下载并放置):
MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb - 映射常用变量(注意字段名匹配):
MaxMindDBEnv GEOIP_COUNTRY_CODE COUNTRY_ISO_CODE
这样,在该虚拟主机作用域下,即可通过 %{ENV:GEOIP_COUNTRY_CODE} 获取两位国家码(如 CN、US)。
用 RewriteRule 实现按区域代理转发
不能直接在 ProxyPass 中写条件逻辑,必须用 RewriteCond + RewriteRule [P] 将请求代理到不同后端集群:
- 中国用户走华东集群:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^CN$RewriteRule ^/(.*)$ http://huadong-backend/$1 [P,L] - 美国用户走美西集群:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$RewriteRule ^/(.*)$ http://us-west-backend/$1 [P,L] - 务必加
[L]终止规则链,避免误匹配后续规则 - 建议设置默认 fallback,例如未识别地域时转至通用集群:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^$RewriteRule ^/(.*)$ http://default-backend/$1 [P,L]
验证与注意事项
配置完成后需重载 Apache(apachectl graceful),并通过日志或测试请求确认变量是否生效:
- 可在
LogFormat中加入%{ENV:GEOIP_COUNTRY_CODE}e查看实际识别结果 - 该方案仅支持静态、粗粒度分流(国家/省),不支持城市级、ISP、经纬度半径等细粒度策略
- 所有路由逻辑硬编码在配置中,新增国家或调整目标需 reload,不适合高频变更场景
- 若需更灵活调度(如按请求头+地域复合判断),应考虑前置网关(如 Nginx、Cloudflare)或 API 网关层处理

















