为什么需要自己的日志系统
Google Analytics 和百度统计固然方便,但它们存在几个致命问题:数据归属于第三方平台、广告拦截器会屏蔽追踪代码、无法采集服务器端数据、采样率限制导致小流量网站数据失真。对于注重数据隐私和完整性的站长来说,自建日志分析系统是绕不开的选择。
ELK(Elasticsearch + Logstash + Kibana)是目前最成熟的日志分析方案,完全开源,生态丰富。虽然初看组件较多,但只要理解核心流程,搭建一套可用系统其实只需要一个下午。
一、系统架构概览
完整的 ELK 日志分析流程如下:
Nginx/Apache → Filebeat → Logstash → Elasticsearch → Kibana
↑
Grok 过滤解析Nginx 的访问日志首先被 Filebeat 采集并发送到 Logstash;Logstash 使用 Grok 正则表达式将原始日志解析成结构化字段;解析后的数据存入 Elasticsearch;最后通过 Kibana 可视化展现。
二、Elasticsearch 安装与配置
2.1 安装
Elasticsearch 依赖 Java 17 以上版本。建议直接从官方仓库安装:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch小内存服务器的优化至关重要。ES 默认分配 1GB 堆内存,对于 2GB 的 VPS 建议改为 512MB。在 /etc/elasticsearch/jvm.options.d/heap.options 中设置 -Xms512m 和 -Xmx512m。
ES 8.x 默认开启安全认证,单用户场景可以先禁用 xpack 安全模块以简化配置。在 /etc/elasticsearch/elasticsearch.yml 中设置 xpack.security.enabled: false 和 discovery.type: single-node。
2.2 启动验证
sudo systemctl start elasticsearch
curl http://localhost:9200正常返回包含 cluster_name 和 cluster_uuid 的 JSON 响应。
三、Logstash 日志解析
Logstash 是整个系统的大脑,负责日志解析和数据清洗。对于 Nginx 日志,最常用的是 combined 格式的 Grok 模式:
sudo apt install logstash创建 /etc/logstash/conf.d/nginx.conf:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
geoip {
source => "clientip"
}
useragent {
source => "agent"
target => "ua"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
}通过 GeoIP 插件可以获取访客的地理位置信息,通过 useragent 插件可以解析浏览器和操作系统类型。这两个插件为后续的数据分析提供了非常丰富的维度。
四、Filebeat 日志采集
Filebeat 作为一个轻量级的日志采集器,安装在每台需要监控的服务器上。它的资源占用极低,适合在低配服务器上运行。
sudo apt install filebeat配置 /etc/filebeat/filebeat.yml:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
server_name: "web01"
output.logstash:
hosts: ["你的日志中心IP:5044"]五、Kibana 可视化
安装 Kibana 同样用 apt:
sudo apt install kibana在 kibana.yml 中将 server.host 设为 0.0.0.0 以允许外部访问。如果开启了 xpack 安全,需要设置 elasticsearch.username 和 elasticsearch.password。
Kibana 安装完成后,通过浏览器访问 http://你的IP:5601。首次使用需要创建 Index Pattern,匹配我们在 Logstash 中定义的索引模板 nginx-access-*。
5.1 我常用的几个可视化面板
实时流量看板: 显示每秒请求数、状态码分布、平均响应时间。使用 Line Chart 展示时间序列,Pie Chart 展示状态码占比。
访客分析看板: 基于 GeoIP 数据的地理分布地图,基于 useragent 数据的浏览器和操作系统排名,基于 clientip 的独立访客统计。
性能分析看板: 最高延迟的 URL 排名,4xx/5xx 错误最多的页面,响应时间的百分位分布(P50、P90、P99)。
SEO 监控看板: 爬虫访问统计(Googlebot、Bingbot、Baiduspider 等),404 错误页面列表,被访问最多的 URL 排名。
六、资源占用与实际部署建议
ELK 全套组件确实比较吃资源,但经过优化可以在 1GB 内存的 VPS 上跑起来:
- Elasticsearch 分配 512MB 堆内存
- Logstash 分配 256MB 堆内存
- Kibana 默认即可
- 如果实在资源紧张,可以用 Vector 替代 Logstash,它用 Rust 编写,性能远优于 Logstash
七、日志的日常使用场景
有了完整的日志系统后,很多之前靠猜的问题变得一目了然:
某天网站突然变慢,打开 Kibana 看性能面板,发现 /api/search 端点的 P99 延迟从 200ms 飙升到了 2000ms。进一步下钻发现,某个爬虫在疯狂抓取搜索结果页,频率高达每分钟 500 次。直接在 Nginx 层面限制该 IP 的速率,网站立刻恢复。
另一个场景是 SEO 优化时,通过分析 404 页面列表,发现很多外部链接指向了已经删除的旧文章。为这些 URL 配置永久重定向,既挽回了流量也避免了权重流失。
总结
自建 ELK 日志系统虽然前期需要投入一些配置时间,但长期来看是非常值得的技术投资。它能让你真正掌握自己网站的数据,不受第三方平台的采样率和隐私政策限制。对于只有一两台服务器的站长,完全可以用低配 VPS 搭建一套简化版,重点监控核心业务指标即可。关键是要把 Grok 解析和 Kibana 面板配置好,这样日常运维中遇到问题就能在几分钟内定位到根因。