Nginx自定义日志格式分析海外访客来源,从配置到出报告

很多站长把网站托管在海外服务器后,总想知道访问者到底来自哪些国家、哪些地区,但默认的 Nginx 日志只记录 IP,看不出有效来源。
其实通过 Nginx 自定义日志格式,把访客 IP、国家地区、浏览器 UA、访问页面等字段单独记录下来,再用 GoAccess 这类工具统计,就能快速生成一份海外访客来源报告。
本文按零基础可操作的标准,从日志格式配置到报告生成完整走一遍。

先搞清楚 Nginx 日志里能记录什么

Nginx 的日志格式由 log_format 指令定义,默认的 combined 格式大致长这样:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

其中 $remote_addr 就是访客 IP,$http_user_agent 是浏览器标识,$http_referer 是来源页面。
要做海外访客来源分析,至少要把 IP、国家地区、访问时间和请求页面完整记下来。

这里推荐一个办法:不改动系统默认日志格式,单独新建一个日志格式,只给指定站点启用,这样不影响其他网站,排查问题也更方便。

第一步:添加自定义日志格式

打开 Nginx 主配置文件,通常位于 /etc/nginx/nginx.conf,在 http {} 块内(与 server {} 平级)加入以下配置:

log_format overseas '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'country=$geoip_country_code city=$geoip_city';

这里的 $geoip_country_code$geoip_city 需要依靠 GeoIP 模块才能取到值。
如果你暂时没有安装 GeoIP,可以先只用 IP 记录,后续进行离线解析。
为了零基础用户能顺利操作,我用两个方案说明:方案一安装 GeoIP 实时输出国家代码,方案二配合离线解析直接分析 IP。

第二步:给站点启用并配置 GeoIP(可选)

如果你用的是 Nginx 官方源安装的版本,一般自带 http_geoip_module,但很多系统默认没有加载。
先确认模块是否开启:

nginx -V 2>&1 | grep geoip

如果输出里有 --with-http_geoip_module,说明支持。
然后在 nginx.conf 中加入 GeoIP 数据库路径:

geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;

注意:新版 Nginx 使用 ngx_http_geoip2_module 时写法略有不同。
以下是用 GeoIP2 的配置示例:

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 60m;
    $geoip2_data_country_code country iso_code;
}

如果你的 Nginx 没有 GeoIP 支持,可以直接跳过这一步,继续用下面介绍的离线解析方法,效果一样能统计海外访客来源。

第三步:设置日志文件路径并重启 Nginx

在站点的 server {} 块中指定日志格式和日志文件:

server {
    access_log /var/log/nginx/overseas-access.log overseas;
}

保存配置文件后,先测试配置是否正常:

nginx -t

确认显示 syntax is ok 后平滑重载:

nginx -s reload

此时访问一次网站,然后查看日志:

tail -f /var/log/nginx/overseas-access.log

如果能看到包含 country= 字段的记录,说明自定义日志格式已经生效;
如果 country 为空,就是 GeoIP 配置没起作用,但不影响 IP 记录,下一步就可以离线解析。

第四步:用 GoAccess 生成海外访客来源报告

比起手动翻日志,推荐用 GoAccess 直接生成 HTML 报告,可视化展示国家、地区、访客数。
安装 GoAccess:

  • Debian/Ubuntu:apt install goaccess
  • CentOS/RHEL:yum install goaccess

然后针对我们自定义的日志格式,写一个对应的解析配置。
GoAccess 默认不认 country= 后面的字段,需要修改配置或通过命令行参数指定。
更简单的做法是让 Nginx 日志兼容 GoAccess 的 common 格式,然后再导入。
这里给一个通用命令:

goaccess /var/log/nginx/overseas-access.log \
  --log-format=COMBINED \
  --geoip-database=/usr/share/GeoIP/GeoLite2-Country.mmdb \
  -o /var/www/html/visitor-report.html

如果你的日志含自定义字段,
GoAccess 可能解析不全。遇到解析问题优先检查日志格式与 --log-format 是否匹配
或者把 country=$geoip_country_code 等字段去掉,
只保留常用字段,
GoAccess 完全能处理。

常见问题与避坑说明

日志文件不生成或一直为空:检查 access_log 路径所在的目录是否存在,Nginx 是否有写入权限。
可用 nginx -tls -l /var/log/nginx/ 验证。

country 字段为空或显示 -:说明 GeoIP 数据库路径不对或模块未加载。
先确认 GeoIP 数据库是否下载到指定路径;
如果暂时不想处理,可直接用 IP 分析工具离线解析。

GoAccess 无法解析自定义字段:自定义字段会打乱原有日志解析规则。
建议单独再写一个满足 combined 格式的日志文件,或者调换字段位置让 country 放在末尾,避免影响 GoAccess 识别。

日志增长过快:海外流量大的站点日志会很快占满磁盘。
建议开启 logrotate 按天切割日志,定期清理旧日志。

验证结果:确认报告里的海外访客来源

打开生成的 HTML 报告,重点看 VisitorsCountries 板块。
如果看到美国、新加坡、德国等地访问记录,说明你的日志记录和统计流程已经跑通。

你也可以用命令行快速验证某段时间的海外 IP 分布:

awk '{print $1}' /var/log/nginx/overseas-access.log | sort | uniq -c | sort -rn | head -20

这样能看到访问量最高的前 20 个 IP,再配合 IP 归属地查询确认国家。
整个流程完成后,你对海外访客来源就有了清晰的数据依据,后续无论是调整站点语言、优化访问速度,还是做地区性内容运营,都能派上用场。

如果你正在处理 Nginx自定义日志格式分析海外访客来源,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
NAS自动同步大模型文件与网站全站备份:从配置到验证的教程
下一篇
swap分区扩容脚本缓解服务器OOM报错
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意