需基于ISP调度因跨网访问延迟高、丢包多,GeoIP2的isp字段配合Nginx map与upstream可实现精准请求级分发;需编译安装geoip2模块、配置mmdb数据库及动态上游映射,并注意大小写匹配、权限校验与定期更新。

为什么需要基于 ISP 的流量调度
用户访问网站时,不同运营商(如电信、联通、移动)之间的网络互通质量差异大,跨网访问常导致延迟高、丢包多。单纯靠 IP 地址段匹配或 DNS 轮询无法精准识别用户所属 ISP,而 GeoIP2 提供的 isp 字段可直接获取运营商名称,配合 Nginx 的 map 指令和 upstream 动态路由,就能实现请求级的智能分发。
编译安装支持 geoip2 的 Nginx
官方 Nginx 不内置 geoip2 支持,需手动编译:
- 下载 ngx_http_geoip2_module 模块
- 获取 MaxMind GeoLite2 ISP 数据库(GeoLite2-ISP.mmdb),注意需注册账号免费下载
- 编译时添加参数:--add-dynamic-module=../ngx_http_geoip2_module --with-compat
- 安装后确认模块加载成功:nginx -V 2>&1 | grep -o geoip2 应有输出
配置 geoip2 提取 ISP 并映射到上游组
在 http 块中定义:
geoip2 /usr/share/GeoIP/GeoLite2-ISP.mmdb {
$geoip2_data_isp isp;
}
map $geoip2_data_isp $upstream_backend {
default backend_default;
"China Telecom" backend_ct;
"China Unicom" backend_cu;
"China Mobile" backend_cm;
}
再定义对应的 upstream:
upstream backend_ct {
server 10.0.1.10:8080;
}
upstream backend_cu {
server 10.0.2.10:8080;
}
upstream backend_cm {
server 10.0.3.10:8080;
}
upstream backend_default {
server 10.0.0.10:8080;
}
最后在 server 块中使用:proxy_pass http://$upstream_backend;
验证与调优要点
- 测试时用真实跨网客户端(如手机切移动/联通数据)访问,避免本地局域网干扰
- 查看 Nginx error log 是否报错“failed to read mmdb”或“no match”,确认路径与权限正确
- ISP 字段值区分大小写且含空格,建议用 curl -sI http://your-site/ | grep Server 配合后端日志观察分发结果
- 生产环境建议加 fallback 逻辑:当 ISP 未命中时,按地域(country)或轮询兜底
- 数据库每月更新一次,可用脚本自动下载并 reload Nginx(nginx -s reload)


















