用ELK日志分析跨境访问记录:从零搭建到实战排查
为什么需要分析跨境访问记录
当你的站点面向全球用户,或突然收到大量海外IP的异常请求时,靠手工翻查Nginx日志几乎不可能。ELK日志分析系统(Elasticsearch + Logstash + Kibana) 可以自动收集、解析并可视化访问日志,帮你快速找出高频请求的跨境IP、访问时间和地理位置。
本文从零开始,让只接触过宝塔面板的新手也能部署一套属于自己的ELK分析环境。
搭建前必备的三样东西
- 一台Linux服务器(CentOS 7+或Ubuntu 20.04+),建议内存至少4GB,否则Elasticsearch可能启动失败。
- 已安装并运行Nginx,且生成了访问日志(默认路径
/var/log/nginx/access.log)。 - 基本掌握SSH连接,会使用
vim或nano编辑文件。
如果你还没装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中制作跨境访问分析面板
- 进入Kibana → Stack Management → Index Patterns,创建
nginx-access-*索引模式,时间字段选@timestamp。 - 进入Discover,确认有数据导入。如果无数据,检查Filebeat和Logstash日志(
journalctl -u logstash)。 - 创建可视化:
- 地域分布:新建Coordinate Map,聚合字段
geoip.location,可直观看到来自哪些国家的访问。 - 请求量TOP国家:新建Vertical Bar,Y轴计数,X轴用
geoip.country_name.keyword。 - 时间趋势:新建Line图,X轴
@timestamp每小时统计。
- 将以上图表组合成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相关疑问,欢迎翻看我之前写的排错系列。