需加载GeoIP2数据库、配置geoip2指令提取省份城市字段,并通过log_format注入日志;下载GeoLite2-City.mmdb至Nginx可读路径并授权,http块中定义geoip2变量与中文日志格式,重启后用curl验证字段是否生效。

要利用 ngx_http_geoip2_module 在 Nginx 日志中记录访客的省份与城市信息,核心是:加载 GeoIP2 数据库、配置 geoip2 指令提取地域字段、再通过 log_format 将这些字段注入日志变量。
准备 MaxMind GeoIP2 City 数据库
该模块不自带数据,必须手动下载并部署官方二进制数据库文件:
- 前往 MaxMind 官网 注册账号,免费获取
GeoLite2-City.mmdb - 建议使用中国大陆镜像源(如腾讯云 COS 或阿里云 OSS 公共 bucket)加速下载
- 将
GeoLite2-City.mmdb放到 Nginx 可读路径,例如/usr/local/share/GeoIP/GeoLite2-City.mmdb - 确保 Nginx 主进程用户(如
www-data或nginx)对该文件有读取权限
在 nginx.conf 中启用 geoip2 并定义变量
在 http 块中添加如下配置,注意路径和字段名需严格匹配数据库结构:
http {
# 加载 GeoIP2 数据库
geoip2 /usr/local/share/GeoIP/GeoLite2-City.mmdb {
$geoip2_data_country_code source=$remote_addr country iso_code;
$geoip2_data_province source=$remote_addr subdivisions 0 names zh-CN;
$geoip2_data_city source=$remote_addr city names zh-CN;
$geoip2_data_lat source=$remote_addr location latitude;
$geoip2_data_lon source=$remote_addr location longitude;
}
<pre class="brush:php;toolbar:false;"># 定义含地域字段的日志格式(支持中文,需确保日志文件编码为 UTF-8)
log_format geoip2_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$geoip2_data_country_code '
'"$geoip2_data_province" "$geoip2_data_city" '
'$geoip2_data_lat $geoip2_data_lon';
access_log /var/log/nginx/access_geoip2.log geoip2_log;}
说明:
-
subdivisions 0表示一级行政区(如“广东省”),部分省份可能有多个 subdivision,通常取第 0 个即可 -
names zh-CN启用中文名称;若未命中或无中文翻译,字段值为空字符串,可在日志中体现为"" - 若需 fallback 英文名,可额外定义
$geoip2_data_province_en subdivisions 0 names en
验证字段是否生效
重启 Nginx 后,可通过以下方式快速确认:
- 执行
nginx -t确保配置语法正确 - 用 curl 模拟请求:
curl -H "X-Real-IP: 1.2.3.4" http://your-domain.com/(替换为真实 IP) - 检查日志输出是否出现类似
"CN" "广东省" "深圳市" 22.5431 114.0579的字段 - 若字段全为空,常见原因:IP 不在数据库中(如内网地址)、路径错误、权限不足、或 IP 被前置代理覆盖 —— 此时应配合
real_ip模块还原真实客户端 IP
注意事项与优化建议
实际部署中容易忽略的关键点:
- 数据库需定期更新(MaxMind 每月发布新版),建议用 cron 自动下载 + reload
- 避免在
server或location块中重复定义geoip2,它只应在http块中声明一次 - 中文字段写入日志时,确保
access_log文件以 UTF-8 编码打开(Linux 默认支持,但某些日志分析工具需显式指定编码) - 高并发场景下,
geoip2查询开销较低,但若仅需国家维度,可单独加载更小的GeoLite2-Country.mmdb提升效率

















