用ELK日志分析跨境访问记录:从零搭建到实战排查

为什么需要分析跨境访问记录

当你的站点面向全球用户,或突然收到大量海外IP的异常请求时,靠手工翻查Nginx日志几乎不可能。ELK日志分析系统(Elasticsearch + Logstash + Kibana) 可以自动收集、解析并可视化访问日志,帮你快速找出高频请求的跨境IP、访问时间和地理位置。
本文从零开始,让只接触过宝塔面板的新手也能部署一套属于自己的ELK分析环境。

搭建前必备的三样东西

  1. 一台Linux服务器(CentOS 7+或Ubuntu 20.04+),建议内存至少4GB,否则Elasticsearch可能启动失败。
  2. 已安装并运行Nginx,且生成了访问日志(默认路径 /var/log/nginx/access.log)。
  3. 基本掌握SSH连接,会使用 vimnano 编辑文件。

如果你还没装Nginx,
先执行 sudo apt update && sudo apt install nginx -y(Ubuntu)或 sudo yum install nginx -y(CentOS)。

分步搭建ELK环境

1. 安装Elasticsearch

ELK各组件版本必须一致,这里以7.17.x系列为例(截至本文撰写时仍可稳定使用)。
直接通过官方YUM仓库安装(Debian系使用apt,步骤类似):

# 导入GPG密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# 添加仓库
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt update
sudo apt install elasticsearch -y

安装后修改配置 /etc/elasticsearch/elasticsearch.yml
找到 network.host 改为 0.0.0.0(允许本机访问),
并设置 discovery.type:
single-node
(单机测试)。

sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

验证:curl http://localhost:9200 返回JSON集群信息即成功。

2. 安装Logstash

sudo apt install logstash -y

创建Logstash配置文件 /etc/logstash/conf.d/nginx-access.conf,内容如下(重点解析跨境访问的IP和时间):

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  geoip {
    source => "clientip"
    target => "geoip"
    database => "/etc/logstash/GeoLite2-City.mmdb"
    add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
    add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
  }
  mutate {
    convert => [ "[geoip][coordinates]", "float" ]
  }
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

注意:上述GeoIP数据库需要自行下载(从MaxMind官网免费注册获取),并放到指定路径。
如果不做地域分析,可暂时去掉 geoip 部分。

3. 安装Kibana

sudo apt install kibana -y

修改配置 /etc/kibana/kibana.yml 中的 server.host:
"0.0.0.0"
elasticsearch.hosts:
["http:
//localhost:
9200"]

sudo systemctl start kibana
sudo systemctl enable kibana

浏览器访问 http://你的服务器IP:5601,首次进入需要设置索引模式(如 nginx-access-*)。

4. 安装并配置Filebeat(日志采集)

Logstash本身可以读文件,但更推荐的轻量级采集器是Filebeat:

sudo apt install filebeat -y

修改 /etc/filebeat/filebeat.yml,input部分:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
output.logstash:
  hosts: ["localhost:5044"]

启动Filebeat:sudo systemctl start filebeat

在Kibana中制作跨境访问分析面板

  1. 进入Kibana → Stack Management → Index Patterns,创建 nginx-access-* 索引模式,时间字段选 @timestamp
  2. 进入Discover,确认有数据导入。如果无数据,检查Filebeat和Logstash日志(journalctl -u logstash)。
  3. 创建可视化:
  • 地域分布:新建Coordinate Map,聚合字段 geoip.location,可直观看到来自哪些国家的访问。
  • 请求量TOP国家:新建Vertical Bar,Y轴计数,X轴用 geoip.country_name.keyword
  • 时间趋势:新建Line图,X轴 @timestamp 每小时统计。
  1. 将以上图表组合成Dashboard,命名“跨境访问监控”。

高频问题与避坑

Q:Logstash启动报错“No config files found”?
A:检查 /etc/logstash/conf.d/ 目录是否存在,以及配置文件后缀是否为 .conf

Q:Kibana中查不到跨境IP的地理信息?
A:大概率是GeoIP数据库未正确下载或路径错。下载时选 GeoLite2-City.mmdb 而非 Country 版本。另外确认日志中包含 clientip 字段。

Q:访问日志时间与服务器时间差8小时?
A:Nginx日志默认使用UTC时间,可在Logstash filter中用 date 插件转换,或修改Nginx配置 log_format 增加 $time_local

Q:服务器内存不足,Elasticsearch被OOM杀死?
A:修改 /etc/elasticsearch/jvm.options-Xms-Xmx 设为不超过内存一半,如 -Xms1g -Xmx1g

验证分析效果

执行以下模拟操作:用一台海外VPS curl你的站点数次,然后刷新Kibana Discover看新数据是否包含 geoip.country_name
同时打开Dashboard,应该看到新记录的地域自动标注在地图上。
至此,你已成功用ELK日志分析跨境访问记录。

如果你的站点流量较大,建议后续加入异常检测(Elasticsearch ML)或配置告警。
遇到任何ELK相关疑问,欢迎翻看我之前写的排错系列。

分享到:
上一篇
Prometheus Grafana服务器监控搭建教程
下一篇
Redis集群缓存跨境网站提速:Redis集群缓存让跨境网站
1
系统公告

机房迁移升级通知

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