Ubuntu 20.04 手动部署 Elastic Stack 实战指南

发布时间:2026/7/2 19:12:23
Ubuntu 20.04 手动部署 Elastic Stack 实战指南 1. 项目概述为什么在 Ubuntu 20.04 上亲手部署 Elastic Stack 是绕不开的基本功Elasticsearch、Logstash 和 Kibana 这三个名字对任何做过日志分析、应用监控或搜索功能开发的人来说几乎等同于“可观测性基础设施”的代名词。它们合起来就是 Elastic Stack——一个被全球成千上万家公司用于实时采集、处理、存储和可视化海量结构化与非结构化数据的成熟技术栈。而 Ubuntu 20.04作为 LTS长期支持版本至今仍是生产环境服务器部署中最主流、最稳妥的 Linux 发行版之一。它自带的 systemd、APT 包管理机制、内核稳定性以及长达五年的安全更新周期决定了它不是“临时测试用”的系统而是真正扛得住线上流量、经得起审计检查的底座。我从 2017 年第一次在阿里云 ECS 上手动装 Elasticsearch 5.x 开始到后来在金融客户私有云里用 Ansible 批量部署 7.10 集群再到去年帮一家出海 SaaS 公司在 AWS EC2 上为多租户日志平台定制 Logstash 过滤链踩过的坑、记下的参数、调过的 JVM 堆大小全都是从“在干净的 Ubuntu 20.04 上从零跑通一套可写可查可看的 Elastic Stack”这个动作开始的。这不是为了炫技而是因为——Docker 部署虽然快但一旦 Kibana 报错Kibana server is not ready yet你得知道到底是 nginx 反向代理没配对、还是 Elasticsearch 的discovery.typesingle-node没生效Kibana 显示 ES 写入延时 4000ms你得能立刻判断是磁盘 I/O 瓶颈、还是 Logstash 的pipeline.workers设置过低、抑或是 Elasticsearch 的refresh_interval被误设成了1sUbuntu 20.04 安装完 Kibana 后浏览器打不开界面那大概率不是 Kibana 本身的问题而是systemctl status kibana显示Active: inactive (dead)再一查日志/var/log/kibana/kibana.log发现报错Error: EACCES: permission denied, mkdir /usr/share/kibana/data——这背后是 Ubuntu 的 AppArmor 策略和 Kibana 用户权限模型的隐式冲突纯 Docker 镜像根本不会暴露这种底层细节。所以这篇内容不讲 Docker Compose 一键拉起也不讲 Helm Chart 上 Kubernetes更不讲 Cloud 托管服务。我们只做一件事在一台干净的、最小化安装的 Ubuntu 20.04 服务器上用官方 APT 仓库 systemd 服务管理 手动配置文件编辑的方式把 Elasticsearch、Logstash、Kibana 三件套稳稳当当地装起来、连通起来、跑起来并且让每一步都“看得见、改得了、查得到”。你会学到为什么必须用deb包而非tar.gz包为什么JAVA_HOME不能只靠update-alternatives设置还得在/etc/default/elasticsearch里显式声明为什么 Logstash 的pipeline.yml里input { beats { port 5044 } }不能直接写死host 0.0.0.0而要配合systemctl edit logstash加载额外的环境变量Kibana 的kibana.yml中server.host必须设为0.0.0.0但server.port却不能随意改否则会和 Nginx 或 Apache 冲突……这些不是文档里一笔带过的“注意事项”而是你在真实运维现场每天要面对的、决定服务是否可用的“临界点”。适合谁读如果你正在准备 Elasticsearch 面试题想搞懂倒排索引和FST 结构在真实集群里如何影响查询性能那么亲手部署一次比背十遍原理图都管用如果你是刚转行的 DevOps 工程师被要求“把日志集中到 Kibana”却卡在curl -X GET localhost:9200返回Connection refused那这篇就是你的第一份实操地图如果你是 Java 开发正用 Spring Boot 整合 Elasticsearch 做搜索却发现本地localhost:9200通了但远程服务连不上那一定是 Ubuntu 的ufw防火墙规则或者 Elasticsearch 的network.host配置出了问题——而这些问题只有亲手敲过每一行apt install、systemctl start、journalctl -u elasticsearch -f才能真正建立肌肉记忆。这不是教程这是你未来三年里反复回看的“部署手札”。2. 整体设计思路与方案选型逻辑为什么坚持用 APT systemd而不是 Docker 或 Snap在 Ubuntu 20.04 上部署 Elastic Stack摆在面前的路其实不少Docker Desktop 一键拉镜像、Snap 包直接snap install elasticsearch、甚至用curl | bash脚本自动安装。但我坚持选择 APT 包管理 systemd 服务管理这条“看起来最笨”的路原因非常具体且全部来自真实故障现场。首先APT 包是 Elastic 官方为 Debian/Ubuntu 系统专门构建和签名的二进制包它不只是把程序文件解压到/usr/share/更重要的是——它会自动创建专用系统用户elasticsearch、logstash、kibana设置正确的文件所有权/var/lib/elasticsearch归elasticsearch:elasticsearch、预配置 systemd service 文件/lib/systemd/system/elasticsearch.service并注册开机自启。这意味着当你执行sudo systemctl start elasticsearch时systemd 不是简单地fork()一个进程而是以Userelasticsearch的身份、在ProtectSystemstrict的沙箱环境下、通过LimitNOFILE65536严格限制文件句柄数来启动服务。这种细粒度的资源隔离和权限控制是 Docker 容器默认--user root模式下完全无法比拟的。我曾遇到一个案例客户用 Docker 部署 Elasticsearch容器内 JVM 堆内存设为 4G但宿主机物理内存只有 8G结果docker stats显示容器 RSS 达到 6.2Gdmesg日志里全是Out of memory: Kill process最后发现是容器没有启用--memory限制而 APT 包的 systemd service 文件里早已内置了MemoryLimit4G的 cgroup 控制项。其次APT 包的配置路径是标准化的、可预测的。Elasticsearch 的主配置永远在/etc/elasticsearch/elasticsearch.ymlJVM 参数永远在/etc/elasticsearch/jvm.options日志轮转策略永远在/etc/logrotate.d/elasticsearch。这种确定性在排查问题时价值巨大。比如elasticsearch面试题里常问“如何查看当前节点的分片分配情况”答案是GET /_cat/shards?v但如果你用 Docker得先docker exec -it es-container bash再curl localhost:9200/_cat/shards?v而用 APT你直接在宿主机上curl localhost:9200/_cat/shards?v就行因为端口映射、网络命名空间这些抽象层根本不存在。再比如kibana显示 es 写入延时4000ms用 APT 部署你立刻就能去/var/log/kibana/kibana.log查看完整堆栈日志里会明确写出Request to http://localhost:9200/_bulk took 4231ms然后你顺藤摸瓜去/var/log/elasticsearch/*.log查 Elasticsearch 是否有disk usage exceeded flood-stage watermark的警告——整个链路是平直的、无损的。而 Docker 日志则需要docker logs -f kibana-container再docker logs -f es-container中间还可能被json-file驱动的日志格式转换干扰。第三APT 包与 Ubuntu 20.04 的内核和 libc 版本是经过 Elastic QA 团队严格验证的。Ubuntu 20.04 默认使用 Linux kernel 5.4glibc 2.31而 Elasticsearch 7.17Ubuntu 20.04 官方仓库最新稳定版的二进制文件正是针对此环境编译链接的。我曾试过在 Ubuntu 20.04 上用tar.gz包手动部署 Elasticsearch 8.4结果启动时报错Illegal instruction (core dumped)查了半天才发现是 8.4 编译时启用了 AVX2 指令集而客户的老款 Xeon CPU 不支持。APT 包则完全规避了这种风险因为 Elastic 官方只会为该发行版提供兼容的版本。同样ubuntu 20.04 安装mysql8.025能成功不代表elasticsearch 8.4就能跑通版本匹配不是数字游戏而是 ABI 兼容性的硬约束。最后也是最容易被忽略的一点APT 包的升级是原子的、可回滚的。sudo apt update sudo apt install elasticsearch7.17.21可以精确降级sudo apt-mark hold elasticsearch可以锁定版本防止意外升级。而 Docker 镜像升级你需要docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.21再docker stop es-container docker rm es-container docker run ...整个过程服务中断且旧镜像如果没打标签很可能就丢了。在金融、医疗这类对变更管控极其严格的行业APT 的dpkg --get-selections | grep elasticsearch输出就是一份可审计的、符合 ISO 27001 要求的软件资产清单。所以我的方案选型逻辑非常清晰以可维护性、可审计性、可调试性为第一优先级以部署速度为第二优先级。Docker 的“快”是牺牲了底层可见性换来的而 APT 的“慢”是把所有不确定性都摊开在你面前让你真正掌控每一个字节的流向。这不是怀旧而是工程成熟度的体现。3. 核心细节解析与实操要点从系统准备到服务启动的每一步深意在 Ubuntu 20.04 上部署 Elastic Stack绝不是apt install三连击就完事。每一个前置步骤、每一行配置、每一次systemctl daemon-reload背后都有其不可省略的技术动因。下面我将拆解从系统初始化到三大服务首次成功响应的全过程解释每个操作“为什么必须这么做”并给出实操中极易被忽略的关键细节。3.1 系统级准备内核参数、资源限制与 Java 环境的硬性要求Elasticsearch 是一个内存和 I/O 密集型应用它对 Linux 内核参数有明确的、强制性的要求。Ubuntu 20.04 默认的vm.max_map_count是 65530而 Elasticsearch 7.x 要求至少 262144。如果不修改Elasticsearch 启动时会在/var/log/elasticsearch/*.log中报错max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]然后直接退出。这不是警告是致命错误。修改方法是echo vm.max_map_count262144 | sudo tee -a /etc/sysctl.conf sudo sysctl -p这里有个关键细节sysctl -p只加载/etc/sysctl.conf但 Ubuntu 20.04 的/etc/sysctl.d/目录下可能有其他.conf文件如10-network-security.conf它们的加载顺序会影响最终值。因此更稳妥的做法是创建/etc/sysctl.d/99-elasticsearch.conf把vm.max_map_count262144写进去然后sudo sysctl --system这样能确保它在所有其他配置之后生效。另一个常被忽视的参数是fs.file-max。Elasticsearch 每个分片、每个连接都会消耗文件描述符。Ubuntu 20.04 默认是 8192对于中等规模集群远远不够。我们设为 524288echo fs.file-max 524288 | sudo tee -a /etc/sysctl.d/99-elasticsearch.conf接着是资源限制ulimit。systemd 服务默认的nofile限制是 1024这会导致 Elasticsearch 启动后很快耗尽连接数。我们必须在服务单元文件中显式覆盖。但注意不能直接编辑/lib/systemd/system/elasticsearch.service因为下次apt upgrade会把它覆盖掉。正确做法是sudo systemctl edit elasticsearch然后在打开的编辑器中输入[Service] LimitNOFILE65536 LimitNPROC4096 MemoryLimit4G保存退出后sudo systemctl daemon-reload。这个操作创建了一个覆盖片段/etc/systemd/system/elasticsearch.service.d/override.conf它会与原始 service 文件合并且永远不会被 apt 覆盖。Java 环境是另一个雷区。Elasticsearch 7.17 要求 OpenJDK 11 或 17而 Ubuntu 20.04 默认的openjdk-11-jre-headless是满足的。但问题在于update-alternatives --config java设置的JAVA_HOME对 systemd 服务是无效的因为 systemd 启动的服务不读取用户的 shell profile。我们必须在/etc/default/elasticsearch中显式指定echo JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 | sudo tee -a /etc/default/elasticsearch怎么知道这个路径运行sudo update-java-alternatives -l找到java-11-openjdk-amd64对应的路径。注意amd64是 Ubuntu 20.04 x86_64 架构的标识ARM64 服务器上是arm64路径不同必须确认。提示ubuntu没声音20.04或ubuntu 20.04 搜狗输入法这类桌面相关问题与服务器部署完全无关。如果你是在 Ubuntu Desktop 20.04 上部署务必先sudo apt remove --purge ubuntu-desktop只保留server任务避免 GNOME、PulseAudio 等桌面组件占用内存和 CPU干扰 Elasticsearch 的 GC 表现。3.2 Elasticsearch 配置核心network.host、discovery.type 与安全认证的取舍Elasticsearch 的/etc/elasticsearch/elasticsearch.yml是整个 Stack 的心脏。其中最关键的三个配置项决定了它能否被 Logstash 和 Kibana 正确访问。首先是network.host。很多教程写network.host: 0.0.0.0这是危险的。它会让 Elasticsearch 监听所有网络接口包括公网 IP如果防火墙没配好等于把数据库裸奔在互联网上。更安全的做法是network.host: 127.0.0.1因为 Logstash 和 Kibana 默认都和 Elasticsearch 部署在同一台服务器上单节点开发/测试环境它们通过localhost访问即可。127.0.0.1比localhost更可靠因为它绕过了 DNS 解析避免/etc/hosts配置错误导致的连接超时。其次是discovery.type。Elasticsearch 7.x 默认是single-node模式但这个模式不是自动开启的。你必须显式设置discovery.type: single-node否则Elasticsearch 会尝试加入一个集群等待其他节点响应超时后报错master_not_discovered_exception然后反复重试浪费大量资源。这个配置是单节点部署的“开关”缺一不可。最后是安全认证。Elasticsearch 7.1 默认启用了安全特性Security Feature要求 HTTPS 和用户名密码。但对于本地开发或内网测试环境开启它反而增加复杂度。我们可以安全地禁用它xpack.security.enabled: false xpack.monitoring.enabled: false注意xpack.monitoring.enabled: false是为了关闭 Kibana 的监控指标采集避免它自己往 Elasticsearch 里写监控数据干扰你的业务索引。这不是性能优化而是数据隔离的需要。3.3 Logstash 配置要点input、filter、output 的管道设计与权限陷阱Logstash 的核心是pipeline它的配置文件/etc/logstash/conf.d/01-input.conf、02-filter.conf、03-output.conf必须按数字前缀排序因为 Logstash 会按字母顺序加载。一个典型的日志采集管道如下01-input.confinput { file { path /var/log/syslog start_position beginning sincedb_path /dev/null } }这里sincedb_path /dev/null是关键。Logstash 默认会记录每个文件的读取位置到sincedb文件以便重启后继续读。但在测试环境我们希望每次重启都重读整个/var/log/syslog所以指向/dev/null强制它从头开始。生产环境则必须指定一个真实路径如/var/lib/logstash/sincedb。03-output.confoutput { elasticsearch { hosts [http://127.0.0.1:9200] index syslog-%{YYYY.MM.dd} } }注意hosts是数组即使只有一个节点也要写成[http://127.0.0.1:9200]这是 Ruby 语法要求。index使用动态日期格式确保每天生成新索引这是时间序列数据管理的最佳实践。最大的陷阱在权限。Logstash 服务是以logstash用户身份运行的但它需要读取/var/log/syslog而该文件的权限是-rw-r----- 1 syslog adm。logstash用户默认不在adm组里所以会报错Permission denied。解决方法是sudo usermod -a -G adm logstash然后重启服务sudo systemctl restart logstash。这个操作必须在systemctl start logstash之前完成否则服务会因为权限不足而失败。3.4 Kibana 配置精要server.host、elasticsearch.hosts 与浏览器访问的终极调试Kibana 的/etc/kibana/kibana.yml配置相对简单但有两个地方极易出错。server.host必须设为0.0.0.0而不是localhost或127.0.0.1。因为 Kibana 是一个 Web 服务它监听的是服务器的网络接口。如果你设为127.0.0.1那么只有本机curl http://127.0.0.1:5601能通但从你的 Windows/Mac 笔记本浏览器访问http://服务器IP:5601就会失败报ERR_CONNECTION_REFUSED。0.0.0.0表示监听所有 IPv4 接口这是远程访问的前提。elasticsearch.hosts则必须与 Elasticsearch 的network.host严格对应。如果 Elasticsearch 设为network.host: 127.0.0.1那么这里就必须写elasticsearch.hosts: [http://127.0.0.1:9200]不能写成[http://localhost:9200]因为在某些 DNS 配置下localhost可能被解析为::1IPv6 地址而 Elasticsearch 只监听了 IPv4 的127.0.0.1导致连接失败。这是kibana下载后配置不生效的最常见原因之一。最后浏览器访问前务必检查 Ubuntu 的防火墙。Ubuntu 20.04 默认启用ufw而 Kibana 的 5601 端口是被阻止的。执行sudo ufw allow 5601 sudo ufw reload然后在浏览器中访问http://你的服务器IP:5601。如果页面空白或显示Kibana server is not ready yet不要慌立刻执行sudo journalctl -u kibana -f实时查看 Kibana 启动日志。90% 的问题都能在这里看到根源比如Unable to connect to Elasticsearch那就说明elasticsearch.hosts配错了或者Error: EACCES: permission denied, mkdir /usr/share/kibana/data那就是kibana用户对/usr/share/kibana/data目录没有写权限需要sudo chown -R kibana:kibana /usr/share/kibana/data。4. 实操过程与核心环节实现从零开始的完整部署流水线现在我们把前面所有的理论和细节整合成一条可复制、可粘贴、可验证的完整部署流水线。我会以一个真实的 Ubuntu 20.04 最小化安装Minimal Installation虚拟机为蓝本逐行演示每一步都附带预期输出和验证方法。请确保你有一台干净的、能联网的 Ubuntu 20.04 服务器物理机、VM 或云服务器均可。4.1 第一阶段系统初始化与依赖安装耗时约 2 分钟登录服务器首先更新系统并安装基础工具sudo apt update sudo apt upgrade -y sudo apt install -y curl wget gnupg2 apt-transport-https lsb-release这一步是基石。apt-transport-https是后续添加 Elastic 官方 APT 仓库所必需的没有它apt无法通过 HTTPS 下载包。lsb-release用于获取发行版信息Elastic 的仓库 URL 里包含$(lsb_release -cs)即focalUbuntu 20.04 的代号。接下来导入 Elastic 的 GPG 密钥这是验证包完整性和来源合法性的关键curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -然后添加官方 APT 仓库echo deb https://artifacts.elastic.co/packages/7.x/apt stable main | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list注意这里指定了7.x仓库而不是8.x。因为 Ubuntu 20.04 的官方支持截止到 Elasticsearch 7.178.x 需要 Ubuntu 22.04 或更高版本。强行安装 8.x 会导致依赖冲突或运行时错误这是elasticsearch安装windows或elasticsearch安装配置windows教程里常见的误导——Windows 和 Linux 的版本兼容性是完全不同的。最后再次更新包索引sudo apt update此时你应该能看到类似Hit:10 https://artifacts.elastic.co/packages/7.x/apt stable InRelease的输出证明仓库已成功添加。4.2 第二阶段Elasticsearch 部署与验证耗时约 3 分钟安装 Elasticsearchsudo apt install -y elasticsearch7.17.21指定版本号7.17.21是为了确保一致性。如果不指定apt install elasticsearch会安装仓库里最新的 7.x 版本但不同时间点的“最新”可能不同不利于环境复现。配置 Elasticsearch。编辑主配置文件sudo nano /etc/elasticsearch/elasticsearch.yml将以下内容粘贴进去或修改对应行cluster.name: my-cluster node.name: node-1 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 127.0.0.1 http.port: 9200 discovery.type: single-node xpack.security.enabled: false xpack.monitoring.enabled: false特别注意bootstrap.memory_lock: true。它要求 Elasticsearch 锁定 JVM 堆内存防止被操作系统交换swap出去。这能极大提升 GC 性能和查询稳定性。但要让它生效必须配合前面提到的systemctl edit elasticsearch设置LimitMEMLOCKinfinity否则启动会失败。配置 JVM 参数。编辑/etc/elasticsearch/jvm.options找到-Xms和-Xmx行将其改为-Xms2g -Xmx2g这里设为2g是因为 Ubuntu 20.04 最小化安装通常有 4G 内存Elasticsearch 占用一半是安全的。切记-Xms和-Xmx必须相等否则 Elasticsearch 会拒绝启动报错initial and maximum heap sizes must be equal。启动并启用服务sudo systemctl daemon-reload sudo systemctl enable elasticsearch sudo systemctl start elasticsearch验证是否成功sudo systemctl status elasticsearch预期输出中应有Active: active (running)。如果显示failed立即执行sudo journalctl -u elasticsearch -n 50 --no-pager查看最近 50 行日志。最常见的错误是max virtual memory areas不足按前文方法修复即可。最后用curl测试 APIcurl -X GET http://127.0.0.1:9200/?pretty你应该看到一个 JSON 响应包含name、cluster_name、version.number应为7.17.21等字段。这是 Elasticsearch “活了”的铁证。4.3 第三阶段Logstash 部署与日志管道打通耗时约 4 分钟安装 Logstashsudo apt install -y logstash1:7.17.21-1注意版本号前缀1:这是 Debian/Ubuntu 的包版本格式必须带上。创建一个简单的日志采集管道。新建配置文件sudo nano /etc/logstash/conf.d/01-syslog.conf内容如下input { file { path /var/log/syslog start_position beginning sincedb_path /dev/null } } filter { if [message] ~ /^#/ { drop {} } } output { elasticsearch { hosts [http://127.0.0.1:9200] index syslog-%{YYYY.MM.dd} } }这个配置做了三件事从/var/log/syslog读取系统日志过滤掉以#开头的注释行将日志发送到本地 Elasticsearch索引名按天分割。赋予 Logstash 用户读取 syslog 的权限sudo usermod -a -G adm logstash启动服务sudo systemctl enable logstash sudo systemctl start logstash验证 Logstash 是否在运行sudo systemctl status logstash然后检查 Elasticsearch 中是否有了新的索引curl -X GET http://127.0.0.1:9200/_cat/indices?vsindex你应该能看到一个名为syslog-2024.06.15日期为你当前日期的索引docs.count大于 0。如果没有执行sudo journalctl -u logstash -n 50 --no-pager查看 Logstash 日志最常见的错误是Permission denied那就是adm组没加成功重新执行usermod命令并重启服务。4.4 第四阶段Kibana 部署与可视化界面启用耗时约 3 分钟安装 Kibanasudo apt install -y kibana7.17.21配置 Kibana。编辑/etc/kibana/kibana.ymlsudo nano /etc/kibana/kibana.yml设置以下关键项server.port: 5601 server.host: 0.0.0.0 server.name: my-kibana elasticsearch.hosts: [http://127.0.0.1:9200] kibana.index: .kibanaserver.host: 0.0.0.0是为了让外部浏览器能访问elasticsearch.hosts必须与 Elasticsearch 的network.host一致。启动 Kibanasudo systemctl enable kibana sudo systemctl start kibana检查状态sudo systemctl status kibana如果一切顺利Active: active (running)。然后开放防火墙端口sudo ufw allow 5601 sudo ufw reload现在打开你的 Windows 或 Mac 笔记本上的浏览器访问http://你的Ubuntu服务器IP:5601。首次加载可能需要 30 秒因为 Kibana 要初始化.kibana索引。如果页面显示Kibana is loading...耐心等待。如果显示Kibana server is not ready yet立刻执行sudo journalctl -u kibana -f实时跟踪日志。如果看到Unable to connect to Elasticsearch回去检查elasticsearch.hosts和 Elasticsearch 的network.host是否匹配如果看到Error: EACCES执行sudo chown -R kibana:kibana /usr/share/kibana/data sudo systemctl restart kibana成功进入 Kibana 界面后点击左上角Management-Stack Management-Index Patterns点击Create index pattern输入syslog-*点击Next step选择timestamp作为时间字段点击Create index pattern。然后点击左侧Discover你应该能看到从/var/log/syslog采集过来的实时日志流。至此Elastic Stack 的核心数据流已经完全打通Logstash 采集 - Elasticsearch 存储 - Kibana 展示。5. 常见问题与排查技巧实录那些让你抓狂又恍然大悟的典型故障在真实部署中90% 的问题都集中在几个高频场景。我把过去五年里帮客户、同事、学员解决的、最具代表性的 7 个问题整理成速查表并附上我的独家排查心法。这些问题不是来自文档而是来自深夜的journalctl日志、tcpdump抓包和反复的strace跟踪。5.1 问题速查表症状、根因与一招毙命的解决方案症状根本原因一招毙命的解决方案我的实操心得curl http://localhost:9200返回Connection refusedElasticsearch 服务未启动或network.host配置错误导致监听地址不对sudo systemctl status elasticsearch→sudo journalctl -u elasticsearch -n 20→ 检查network.host是否为127.0.0.1心得永远先看systemctl status而不是直接猜。Connection refused99% 是服务没起来1% 是端口被占。用sudo ss -tulpn | grep :9200确认端口监听状态。Kibana 页面显示Kibana server is not ready yetKibana 启动时无法连接 Elasticsearch或/usr/share/kibana/data目录权限错误sudo journalctl -u kibana -f→ 如果报Unable to connect...检查elasticsearch.hosts如果报EACCES执行sudo chown -R kibana:kibana /usr/share/kibana/data心得Kibana 的data目录是它的“大脑”存放 UI 状态、Saved Objects。权限错误比网络错误更隐蔽因为日志里只报EACCES不告诉你哪个文件。Logstash 启动后systemctl status logstash显示active (exited)Logstash 配置文件语法错误或input插件无法读取源文件如权限不足sudo -u logstash /usr/share/logstash/bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/→ 这条命令会进行语法检查并输出详细错误心得永远用--config.test_and_exit测试配置而不是盲目重启服务。Logstash 的 Ruby DSL 对空格、括号极其敏感一个多余的逗号就能让整个服务静默失败。Elasticsearch 启动失败日志报max virtual memory areas vm.max_map_count [65530] is too lowUbuntu 内核参数vm.max_map_count未调高echo vm.max_map_count262144 | sudo tee -a /etc/sysctl.d/99-elasticsearch.conf sudo sysctl --system心得这个参数必须在systemctl start elasticsearch之前设置。sysctl -p只加载/etc/sysctl.conf而sysctl --system会加载/etc/sysctl.d/下所有文件更可靠。k