ELK Stack 日志分析平台搭建教程
ELK Stack 是由 Elasticsearch、Logstash 和 Kibana 三个开源组件组成的日志分析平台。Elasticsearch 负责存储和搜索,Logstash 负责数据处理和管道,Kibana 提供可视化界面。本文将在搬瓦工 VPS 上使用 Docker 搭建完整的 ELK 日志分析平台。
一、环境要求
- 内存:ELK Stack 资源消耗较大,建议至少 4GB 内存。Elasticsearch 默认需要 2GB 堆内存。
- 磁盘:日志数据会持续增长,建议预留 40GB 以上空间。
- 前置条件:已安装 Docker。
注意:如果 VPS 内存不足 4GB,建议使用更轻量的 Grafana Loki 方案。
二、系统优化
Elasticsearch 需要调整一些系统参数:
# 增加虚拟内存映射限制
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
# 增加文件描述符限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
三、Docker Compose 部署
mkdir -p /opt/elk
cat > /opt/elk/docker-compose.yml <<'EOF'
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
container_name: elasticsearch
restart: unless-stopped
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- xpack.security.http.ssl.enabled=false
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- cluster.name=elk-cluster
ports:
- "9200:9200"
volumes:
- es-data:/usr/share/elasticsearch/data
ulimits:
memlock:
soft: -1
hard: -1
logstash:
image: docker.elastic.co/logstash/logstash:8.13.0
container_name: logstash
restart: unless-stopped
depends_on:
- elasticsearch
ports:
- "5044:5044"
- "5000:5000/tcp"
- "5000:5000/udp"
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
environment:
- LS_JAVA_OPTS=-Xmx512m -Xms512m
kibana:
image: docker.elastic.co/kibana/kibana:8.13.0
container_name: kibana
restart: unless-stopped
depends_on:
- elasticsearch
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
volumes:
es-data:
EOF
四、Logstash 管道配置
mkdir -p /opt/elk/logstash/pipeline
cat > /opt/elk/logstash/pipeline/logstash.conf <<'EOF'
input {
beats {
port => 5044
}
tcp {
port => 5000
codec => json_lines
}
syslog {
port => 5000
type => "syslog"
}
}
filter {
if [type] == "nginx-access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
geoip {
source => "clientip"
}
}
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
}
EOF
启动服务
cd /opt/elk
docker compose up -d
# 等待 Elasticsearch 启动完成
sleep 30
curl http://localhost:9200/_cluster/health?pretty
五、配置 Filebeat 发送日志
在需要收集日志的服务器上安装 Filebeat,将日志发送到 Logstash:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
type: nginx-access
- type: log
enabled: true
paths:
- /var/log/syslog
fields:
type: syslog
output.logstash:
hosts: ["YOUR_ELK_SERVER:5044"]
六、Kibana 基础使用
访问 http://你的IP:5601 打开 Kibana 界面。
6.1 创建数据视图
- 进入「Management」→「Stack Management」→「Data Views」→「Create data view」。
- 输入索引模式如
filebeat-*,选择时间字段@timestamp。
6.2 日志搜索
进入「Discover」页面,使用 KQL(Kibana Query Language)搜索日志:
# 搜索包含 error 的日志
message: "error"
# 搜索特定 HTTP 状态码
response: 404 or response: 500
# 搜索来自特定 IP 的请求
clientip: "192.168.1.100"
# 组合条件
type: "nginx-access" and response >= 400
七、索引生命周期管理
配置 ILM(Index Lifecycle Management)自动管理索引,防止磁盘被撑满:
# 通过 API 创建 ILM 策略
curl -X PUT "http://localhost:9200/_ilm/policy/log_policy" -H 'Content-Type: application/json' -d'
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "5GB",
"max_age": "7d"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}'
八、安全配置
# 通过防火墙限制访问
ufw allow from 127.0.0.1 to any port 9200
ufw allow from 127.0.0.1 to any port 5601
ufw deny 9200
# Kibana 通过 Nginx 反向代理对外提供服务
# 参考 kibana-dashboard-visualization.html 中的 Nginx 配置
九、性能优化
- 调整 JVM 堆内存:Elasticsearch 的堆内存建议设为可用内存的一半,但不超过 32GB。
- 优化分片数量:单节点环境建议每个索引只设 1 个分片。
- 禁用副本:单节点不需要副本分片。
# 设置默认索引模板
curl -X PUT "http://localhost:9200/_template/default" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}'
十、常见问题
Elasticsearch 启动失败
# 检查日志
docker logs elasticsearch
# 常见原因:vm.max_map_count 未设置
sysctl vm.max_map_count
磁盘空间不足
# 查看索引占用空间
curl http://localhost:9200/_cat/indices?v&s=store.size:desc
# 删除旧索引
curl -X DELETE "http://localhost:9200/filebeat-2024.01.*"
总结
ELK Stack 是功能最完善的日志分析平台,适合需要深度日志搜索和分析的场景。如果 VPS 内存有限,可以考虑更轻量的 Grafana Loki 方案。搭配 Filebeat 采集日志、Kibana 可视化展示,构成完整的日志管理体系。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。