转载

Nginx GeoIP2 配置记录:模块检查与地域分流

整理旧版 Tengine 与 GeoIP2 的配置思路,修正模块检查命令,说明 IP 数据库、代理来源地址和分流规则的验证范围。

适用范围与原记录

原记录在 Tengine 2.3.3 中编译 GeoIP2 模块,并通过国家代码选择后端。本文保留配置思路,移除未经核验的第三方压缩包与 IP 数据库下载命令。模块源码、二进制及数据库应从对应项目或数据提供方获取,并遵循其更新与使用要求。

1. 模块编译与检查

GeoIP2 模块依赖 libmaxminddb。是否静态编译或作为动态模块加载,需要与实际 Nginx/Tengine 构建方式保持一致;安装了库并不代表当前运行的 Nginx 已加载模块。

nginx -V
nginx -t

原文通过 nginx -m 检查模块的步骤不准确。Nginx 的 -V 输出版本、编译器和 configure 参数;动态模块还要核对 load_module 与实际文件。-t 用于检查配置语法及引用文件是否可用。

2. 先读取国家代码

在 http 上下文配置数据库路径和变量,实际文件需存在且对服务账户可读:

geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
    $geoip2_country_code country iso_code;
}

map $geoip2_country_code $selected_upstream {
    default backend_default;
    CN backend_cn;
}

upstream backend_default {
    server 127.0.0.1:8888;
}

upstream backend_cn {
    server 127.0.0.1:17687;
}

这里是演示分流,不代表需要阻止或允许某个地区。默认分支也包括无法识别的情况,必须由业务明确决定。

3. 将分流结果用于代理

server {
    listen 8080;
    server_name _;

    location / {
        proxy_pass http://$selected_upstream;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这段配置需要和前面的 http 配置组合,并在实际模块版本上执行 nginx -t。原文在 if 内外重复书写代理目标,修订后用 map 表达选择关系,使默认行为更容易检查。

4. 检查地址来源与数据质量

如果前面还有 CDN 或代理,Nginx 看到的连接地址可能不是最终客户端。可信代理范围与真实地址处理必须独立配置,不能无条件信任用户自行传来的转发头。

IP 数据库中的地域只是推断信息,VPN、移动网络与数据库更新都可能影响结果。测试应包含已知国家代码、未知地址以及经过代理的请求,并在访问日志中观察实际选择的上游。

参考与来源

正文到此结束