nginx需通过ngx_http_geoip2_module模块实现国家级流量过滤:先编译或安装支持该模块的nginx(版本≥1.18),再加载geolite2-country.mmdb数据库,最后用map或if结合return/deny指令按$geoip2_data_country_code变量控制访问。

Linux 下在 Nginx 中使用 GeoIP(现多用 GeoIP2)模块过滤特定国家流量,核心是:编译或安装支持 GeoIP2 的 Nginx,加载 MaxMind 数据库,再通过 map 或 if 配合 return/rewrite/deny 实现按国家控制访问。
确认 Nginx 是否已支持 GeoIP2 模块
Nginx 官方不内置 GeoIP2,需手动启用。主流方式有两种:
- 使用官方推荐的
ngx_http_geoip2_module(替代已废弃的geoip模块),需从源码编译或通过包管理器安装带该模块的版本(如 Ubuntu 的nginx-extras或 Alpine 的nginx-mod-http-geoip2) - 检查是否已加载:
nginx -V 2>&1 | grep -o geoip2,有输出说明支持;若无,需重新编译或换发行版包
下载并配置 GeoIP2 数据库
MaxMind 提供免费版 GeoLite2 Country(需注册账号获取下载链接):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 下载
GeoLite2-Country.mmdb,建议放在/usr/share/GeoIP/或/etc/nginx/geoip2/ - 确保 Nginx 进程有读取权限:
chown www-data:www-data /path/to/GeoLite2-Country.mmdb(用户组依实际运行用户调整) - 在
nginx.conf的http块中添加:
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_data_country_code source=$remote_addr country iso_code;
}
该配置将客户端 IP 对应的国家代码(如 CN、US)存入变量 $geoip2_data_country_code。
按国家过滤流量(允许/拒绝)
在 server 或 location 块中使用条件判断:
- 禁止某国访问(如屏蔽中国):
if ($geoip2_data_country_code = "CN") { return 403; } - 仅允许某国访问(如只放行美国):
if ($geoip2_data_country_code != "US") { return 403; } - 更高效做法:用
map预定义规则,避免重复 if 判断(推荐):map $geoip2_data_country_code $allowed { default 0; US 1; CA 1; } server { if ($allowed = 0) { return 403; } }
验证与调试要点
配置后务必测试生效逻辑:
- 重载 Nginx:
nginx -t && systemctl reload nginx - 用不同国家代理或工具(如 curl + proxy)测试请求头中
X-Forwarded-For是否被正确识别(注意:若前端有 CDN 或反向代理,需设置real_ip_header和set_real_ip_from确保取到真实 IP) - 开启 Nginx 错误日志级别为
info,并在日志中记录变量:log_format main '$remote_addr - $geoip2_data_country_code ...';,便于排查匹配失败原因










