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% 的循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。