资讯动态

ELK Stack 从零到一实战部署指南:Ubuntu环境搭建与日志可视化

发布时间:2026/9/5 2:22:08 来源:尧图企业网站定制
最近在整理项目日志时发现很多开发者对 ELK 这套强大的日志管理工具既向往又畏惧。向往的是它集中式日志收集、实时搜索和分析的能力畏惧的是其组件繁多、配置复杂网上教程要么版本过时要么步骤跳跃导致从零搭建一个可用的 ELK 平台困难重重。本文将为你提供一份从零到一的 ELK Stack 实战部署指南内容涵盖 Ubuntu Server 环境下的完整安装、配置、集成与常见问题排查。无论你是运维工程师、后端开发者还是希望提升项目可观测性的技术负责人都能通过本文获得一套可直接复用于生产或测试环境的配置方案。1. ELK Stack 核心概念与价值在深入部署之前我们首先要理解 ELK 是什么以及它能为我们解决什么问题。1.1 什么是 ELK StackELK 是三个开源项目的首字母缩写它们共同构成了一个强大的日志管理和分析平台Elasticsearch一个分布式、RESTful 风格的搜索和分析引擎。它负责存储、索引和搜索海量日志数据是 ELK 的核心存储与计算组件。Logstash一个服务器端的数据处理管道能够同时从多个来源采集数据进行转换解析、过滤、丰富然后将其发送到指定的“存储库”如 Elasticsearch。它负责数据的收集、解析和转发。Kibana一个为 Elasticsearch 提供数据可视化的 Web 界面。用户可以通过它进行日志搜索、创建交互式仪表盘Dashboard和可视化图表是 ELK 的“脸面”。随着技术演进Beats一系列轻量级数据采集器的出现使得架构更加灵活因此现在也常被称为Elastic Stack。1.2 为什么需要 ELK在分布式系统、微服务架构盛行的今天日志分散在各个服务器、容器和应用中。传统的tail -f、grep等方式在问题定位、性能分析和安全审计时效率极低。ELK Stack 的核心价值在于集中化管理将来自不同服务器、不同应用、不同格式的日志统一收集到中心平台。实时搜索与分析提供近乎实时的全文搜索和结构化查询能力快速定位问题。强大的可视化通过图表、仪表盘直观展示系统运行状态、业务指标和错误趋势。故障预警结合告警功能可以在错误率飙升、服务异常时及时通知相关人员。1.3 典型应用场景应用故障排查快速搜索特定请求ID、错误码或异常堆栈。业务指标监控统计接口响应时间、QPS、用户行为路径。安全合规审计追踪用户登录、敏感操作和潜在攻击行为。基础设施监控收集服务器系统日志syslog、容器日志、网络设备日志。2. 环境准备与规划在开始安装前我们需要规划好部署环境。本文以Ubuntu Server 22.04 LTS为例进行演示该版本长期支持稳定性好。其他 Linux 发行版如 CentOS步骤类似主要区别在于包管理工具。2.1 系统要求与建议操作系统Ubuntu 22.04 LTS (Jammy Jellyfish) 或 20.04 LTS。建议使用纯净的服务器环境。硬件配置内存至少 4GB推荐 8GB 或以上。Elasticsearch 和 Logstash 是内存消耗大户。CPU2 核以上。磁盘至少 20GB 可用空间建议使用 SSD 以提升索引和查询性能。网络确保服务器之间如果分布式部署以及客户端到服务器的网络通畅。本文为单机部署All-in-One。Java 环境Elasticsearch 和 Logstash 依赖 Java。我们将安装 OpenJDK 17Elasticsearch 8.x 的推荐版本。2.2 版本说明与兼容性Elastic Stack 组件版本必须严格保持一致否则可能出现兼容性问题。本文撰写时最新的稳定版本系列是8.x。我们选择8.13.0版本进行演示。Elasticsearch: 8.13.0Logstash: 8.13.0Kibana: 8.13.0重要提示生产环境请务必查阅 Elastic 官方文档 确认版本兼容性。以下所有配置和命令均基于 8.13.0 版本其他版本可能需要调整。2.3 初始服务器设置以root用户或具有sudo权限的用户登录服务器进行基础准备。# 1. 更新系统包列表并升级现有软件包 sudo apt update sudo apt upgrade -y # 2. 安装必要的工具 sudo apt install -y curl wget vim net-tools # 3. 关闭交换分区 (Swap)提升 Elasticsearch 性能 sudo swapoff -a # 永久禁用编辑 /etc/fstab注释掉包含 ‘swap’ 的行 sudo sed -i /swap/s/^/#/ /etc/fstab # 4. 调整系统限制和内存映射 (VM) # 编辑系统限制配置文件 sudo vim /etc/security/limits.conf在文件末尾添加以下内容* soft nofile 65536 * hard nofile 65536 * soft nproc 4096 * hard nproc 4096 elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited保存并退出。# 5. 调整虚拟内存映射数量 sudo vim /etc/sysctl.conf添加或修改以下行vm.max_map_count262144保存后使配置生效sudo sysctl -p3. 安装 Java 环境如前所述我们需要安装 OpenJDK 17。# 安装 OpenJDK 17 sudo apt install -y openjdk-17-jdk # 验证安装 java -version预期输出应类似openjdk version 17.0.10 2024-01-16 OpenJDK Runtime Environment (build 17.0.107-Ubuntu-1ubuntu122.04) OpenJDK 64-Bit Server VM (build 17.0.107-Ubuntu-1ubuntu122.04, mixed mode, sharing)4. 安装与配置 ElasticsearchElasticsearch 是核心我们先安装它。4.1 添加 Elasticsearch APT 仓库并安装# 1. 导入 Elasticsearch 的 GPG 密钥 wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg # 2. 添加 APT 仓库 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 # 3. 更新包列表并安装 Elasticsearch sudo apt update sudo apt install -y elasticsearch4.2 配置 Elasticsearch主要配置文件位于/etc/elasticsearch/目录下。# 备份原始配置 sudo cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak # 编辑主配置文件 sudo vim /etc/elasticsearch/elasticsearch.yml找到并修改以下关键参数根据你的环境调整# ---------------------------- 集群与节点 ------------------------------ # 集群名称同一集群内所有节点必须相同 cluster.name: my-elk-cluster # 节点名称建议具有描述性 node.name: elk-node-1 # 是否为主节点单节点集群必须为 true node.roles: [ master, data, ingest ] # ---------------------------- 网络与发现 ------------------------------ # 绑定地址设置为 0.0.0.0 以允许其他机器访问生产环境建议指定IP network.host: 0.0.0.0 # HTTP API 端口Kibana 通过此端口连接 http.port: 9200 # 初始主节点列表单机部署就写自己 discovery.seed_hosts: [127.0.0.1, [::1]] # 初始主节点候选者 cluster.initial_master_nodes: [elk-node-1] # ---------------------------- 安全与 TLS (8.x 默认开启) -------------------- # 单机测试可以暂时禁用安全特性以简化流程 xpack.security.enabled: false xpack.security.enrollment.enabled: false生产环境警告将network.host设置为0.0.0.0且禁用安全功能存在风险。生产环境务必配置防火墙、启用安全特性TLS/SSL 和用户认证。4.3 启动 Elasticsearch 并验证# 1. 设置开机自启并启动服务 sudo systemctl daemon-reload sudo systemctl enable elasticsearch sudo systemctl start elasticsearch # 2. 查看服务状态确保状态为 active (running) sudo systemctl status elasticsearch # 3. 等待几秒后通过 curl 测试 Elasticsearch 是否运行 curl -X GET localhost:9200/如果看到包含you know, for search和版本信息的 JSON 响应说明 Elasticsearch 启动成功。{ name : elk-node-1, cluster_name : my-elk-cluster, cluster_uuid : abcdefghijklmnop, version : { number : 8.13.0, build_flavor : default, build_type : deb, build_hash : abc123, build_date : 2024-01-01T00:00:00.000Z, build_snapshot : false, lucene_version : 9.10.0, minimum_wire_compatibility_version : 7.17.0, minimum_index_compatibility_version : 7.0.0 }, tagline : You Know, for Search }5. 安装与配置 KibanaKibana 是我们的可视化工具。5.1 安装 Kibana# 安装 Kibana (仓库已在安装 Elasticsearch 时添加) sudo apt install -y kibana5.2 配置 Kibana编辑 Kibana 配置文件sudo vim /etc/kibana/kibana.yml找到并修改以下参数# Kibana 服务端口 server.port: 5601 # 监听地址0.0.0.0 允许远程访问 server.host: 0.0.0.0 # Elasticsearch 服务地址因为我们在一台机器上 elasticsearch.hosts: [http://localhost:9200] # 在 8.x 中如果 Elasticsearch 禁用了安全这里也需要对应设置 elasticsearch.username: kibana_system # 如果启用了安全需要配置用户 elasticsearch.password: your_password # 如果启用了安全需要配置密码 # 禁用安全特性与 Elasticsearch 配置保持一致 xpack.security.enabled: false # 设置 Kibana 显示语言为中文可选 i18n.locale: zh-CN5.3 启动 Kibana 并访问# 设置开机自启并启动服务 sudo systemctl enable kibana sudo systemctl start kibana # 查看状态 sudo systemctl status kibana现在打开浏览器访问http://你的服务器IP:5601。稍等片刻Kibana 启动较慢你将看到 Kibana 的欢迎界面。6. 安装与配置 LogstashLogstash 负责数据处理管道。6.1 安装 Logstashsudo apt install -y logstash6.2 创建一个简单的 Logstash 配置Logstash 配置分为三部分Input输入、Filter过滤、Output输出。我们先创建一个测试配置从标准输入读取数据处理后输出到 Elasticsearch 和标准输出便于调试。# 创建配置文件目录如果不存在 sudo mkdir -p /etc/logstash/conf.d/ # 创建测试配置文件 sudo vim /etc/logstash/conf.d/test.conf输入以下内容input { # 使用标准输入作为数据源方便测试 stdin { } } filter { # 使用 grok 过滤器解析数据这里是一个简单示例 # 假设输入格式为[TIMESTAMP] LEVEL MESSAGE grok { match { message \[%{TIMESTAMP_ISO8601:timestamp}\] %{LOGLEVEL:level} %{GREEDYDATA:log_message} } } # 将解析出的 timestamp 字段转换为 timestamp 字段 date { match [ timestamp, ISO8601 ] target timestamp } } output { # 输出到标准输出格式为 rubydebug便于调试查看 stdout { codec rubydebug } # 输出到 Elasticsearch elasticsearch { hosts [http://localhost:9200] index logstash-test-%{YYYY.MM.dd} # 按天创建索引 } }6.3 测试 Logstash 配置并运行# 1. 测试配置文件语法 sudo /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t -f /etc/logstash/conf.d/test.conf # 输出应为 “Configuration OK” # 2. 以前台方式运行 Logstash 进行测试 sudo /usr/share/logstash/bin/logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/test.conf程序启动后在控制台输入一行测试日志[2024-05-27T10:30:00Z] INFO This is a test log message from ELK tutorial.按回车后你将在控制台看到 Logstash 处理后的结构化输出rubydebug 格式同时数据已被发送到 Elasticsearch。按CtrlC停止测试。6.4 配置 Logstash 作为系统服务# 启动 Logstash 服务并设置开机自启 sudo systemctl enable logstash sudo systemctl start logstash # 查看状态 sudo systemctl status logstash7. 完整实战收集系统日志并可视化现在我们搭建一个最常用的场景使用Filebeat轻量级日志采集器收集系统日志/var/log/syslog通过 Logstash 处理存入 Elasticsearch最后在 Kibana 中查看。7.1 安装与配置 Filebeat# 安装 Filebeat sudo apt install -y filebeat # 配置 Filebeat sudo vim /etc/filebeat/filebeat.yml我们需要修改两个主要部分设置日志输入找到filebeat.inputs部分启用并配置一个输入。配置输出到 Logstash注释掉默认的 Elasticsearch 输出启用 Logstash 输出。具体修改如下只展示关键部分其他保持默认# Filebeat inputs filebeat.inputs: - type: filestream enabled: true paths: - /var/log/syslog # 为日志添加标签便于识别 tags: [system-syslog] # 指定编码 encoding: utf-8 # Filebeat modules # 禁用自动加载模块我们手动配置 filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false # Outputs # 输出到 Logstash output.logstash: hosts: [localhost:5044] # 如果 Logstash 和 Filebeat 在不同主机需修改为 Logstash 的 IP # 禁用输出到 Elasticsearch (默认启用需要注释掉) #output.elasticsearch: # hosts: [localhost:9200]7.2 配置 Logstash 接收 Filebeat 数据创建一个新的 Logstash 配置来处理系统日志。sudo vim /etc/logstash/conf.d/system-syslog.conf输入以下内容input { beats { port 5044 host 0.0.0.0 } } filter { # 如果消息是 syslog 格式可以用 syslog 过滤器解析 # 但 /var/log/syslog 格式可能因系统而异这里先用 grok 尝试通用解析 grok { match { message %{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:syslog_message} } } # 解析时间 date { match [ syslog_timestamp, MMM d HH:mm:ss, MMM dd HH:mm:ss ] target timestamp } # 添加一个字段标识来源 mutate { add_field { log_source system_syslog } } } output { elasticsearch { hosts [http://localhost:9200] index filebeat-system-syslog-%{YYYY.MM.dd} } # 可选同时输出到控制台用于调试 # stdout { codec rubydebug } }重启 Logstash 以加载新配置sudo systemctl restart logstash7.3 启动 Filebeat 并测试# 测试配置文件语法 sudo filebeat test config # 测试输出连接连接到 Logstash sudo filebeat test output # 启动 Filebeat 服务 sudo systemctl enable filebeat sudo systemctl start filebeat # 查看 Filebeat 日志确认无报错 sudo tail -f /var/log/filebeat/filebeat7.4 在 Kibana 中查看日志打开 Kibana (http://IP:5601)。首次使用需要创建索引模式Index Pattern。点击左侧菜单栏的“管理”(Management) -“堆栈管理”(Stack Management)。在Kibana部分点击“索引模式”(Index Patterns)。点击“创建索引模式”(Create index pattern)。在索引模式名称中输入filebeat-system-syslog-*点击“下一步”。选择时间字段为timestamp点击“创建索引模式”。查看数据。点击左侧菜单栏的“发现”(Discover)。在上方选择刚创建的索引模式filebeat-system-syslog-*。你将看到从/var/log/syslog收集上来的系统日志已经过解析字段清晰。8. 常见问题与排查思路ELK 部署过程中难免会遇到问题以下是几个典型问题的排查思路。问题现象可能原因排查步骤与解决方案Elasticsearch 启动失败1. 内存不足。2. 配置文件语法错误。3. 端口被占用。4. 系统限制未调整。1. 检查sudo systemctl status elasticsearch和journalctl -u elasticsearch查看详细错误。2. 确认elasticsearch.yml格式正确YAML 缩进。3. 运行sudo netstat -tlnp | grep :9200检查端口占用。4. 确认已完成本文2.3 节的系统限制调整。Kibana 无法连接 Elasticsearch1. Elasticsearch 未运行或地址/端口错误。2. 安全配置不匹配如一端启用 TLS另一端未启用。3. 防火墙阻止连接。1. 确认 Elasticsearch 的http.port(默认 9200) 可访问curl http://localhost:9200。2. 核对kibana.yml中的elasticsearch.hosts配置。3. 检查 Elasticsearch 和 Kibana 关于xpack.security.enabled的配置是否一致。4. 检查防火墙规则sudo ufw status。Logstash 启动报错1. 配置文件语法错误。2. Java 堆内存不足。3. 依赖的插件未安装。1. 使用sudo /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t -f /你的配置文件测试语法。2. 调整/etc/logstash/jvm.options中的-Xms和-Xmx参数如-Xms512m -Xmx512m。3. 根据错误信息安装对应插件例如sudo /usr/share/logstash/bin/logstash-plugin install logstash-filter-mutate。Filebeat 无法发送数据到 Logstash1. Logstash 的 Beats 输入插件未在指定端口监听。2. 网络不通或防火墙。3. Filebeat 配置文件路径错误。1. 确认 Logstash 配置中beatsinput 的port与 Filebeat 配置中output.logstash.hosts的端口一致默认 5044。2. 在 Filebeat 机器上运行telnet logstash_ip 5044测试连通性。3. 检查 Filebeat 日志sudo tail -f /var/log/filebeat/filebeat。Kibana 中看不到数据1. 索引模式创建错误。2. 数据未成功写入 Elasticsearch。3. 时间范围选择不对。1. 在 Kibana “开发工具” (Dev Tools) 中运行GET /_cat/indices?v查看是否存在预期的索引如filebeat-system-syslog-2024.05.27。2. 检查 Logstash/Filebeat 日志确认无报错且数据正在发送。3. 在 Kibana “发现” 页面右上角调整时间范围到“最近 15 分钟”或“今天”。9. 生产环境最佳实践与建议将 ELK 用于生产环境需要考虑更多关于性能、安全、可靠性和维护性的问题。9.1 架构规划分离部署不要将所有组件Elasticsearch, Logstash, Kibana放在同一台服务器上。建议Elasticsearch 集群至少 3 个节点1 主 2 数据分布在不同的物理机或虚拟机以实现高可用和负载均衡。Logstash可以部署在应用服务器上边车模式或集中部署为日志处理层。Kibana单独部署并通过负载均衡器对外提供服务。引入消息队列在高日志量场景下在数据源和 Logstash 之间引入Kafka或Redis作为缓冲队列避免数据丢失和背压问题。9.2 安全加固启用安全特性务必启用 Elasticsearch 和 Kibana 的xpack.security配置 TLS/SSL 证书并为不同用户如管理员、只读用户设置强密码和精细化的角色权限。网络隔离使用防火墙如ufw或iptables严格限制访问端口。例如只允许特定 IP 访问 Kibana (5601) 和 Elasticsearch API (9200)。定期更新关注 Elastic 官方安全公告定期更新 ELK 组件到安全版本。9.3 性能与稳定性优化Elasticsearch 调优根据数据量调整JVM 堆内存通常设置为系统内存的 50%不超过 32GB。合理设置索引的分片Shard数量和副本Replica数量。过多的分片会降低性能。使用索引生命周期管理ILM策略自动将旧索引转移到冷存储或删除控制集群规模。Logstash 调优根据输入源和过滤复杂度调整pipeline.workers和pipeline.batch.size。对复杂的grok解析考虑使用dissect过滤器或提前在应用层进行日志结构化输出 JSON。Filebeat 调优配置backoff和max_backoff以应对 Logstash 临时不可用。使用loadbalance选项将负载分配到多个 Logstash 节点。9.4 配置与维护配置版本化将 Elasticsearch、Logstash、Kibana 的配置文件纳入版本控制系统如 Git。监控 ELK 自身部署一个独立的、轻量的监控系统如 Prometheus Grafana来监控 ELK 集群的健康状态CPU、内存、磁盘、索引速率、查询延迟等。制定日志规范在开发阶段就约定应用日志的输出格式如 JSON可以极大简化 Logstash 的grok解析规则提升处理性能和可维护性。从在单台 Ubuntu Server 上成功部署 ELK Stack到配置 Filebeat 收集系统日志并在 Kibana 中可视化你已经走完了搭建一个基础日志平台的核心流程。这个平台本身就是一个强大的工具但它的真正价值在于你如何用它来解决实际业务中的问题。接下来你可以尝试收集 Nginx/Apache 访问日志、Java 应用的 Logback/Log4j2 日志或者 Docker 容器日志逐步构建起属于你自己或团队的集中式可观测性体系。过程中遇到的任何挑战都可以回到本文的“常见问题”部分寻找思路或查阅 Elastic 官方文档获取最权威的指导。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价