第四章 环境准备

做日志采集,环境没搭好,后面全是坑。我见过不少团队,工具选得挺好,部署上去却跑不起来——排查半天发现是JDK版本不对,或者防火墙把端口掐了。

这章我带你把基础环境捋一遍。说白了,就是把操作系统、Java、Node.js、网络和防火墙这四件事搞定。每一步都有我的血泪教训,你照着来,能省不少事。

核心原则:环境版本统一、路径规范、防火墙最小开放。别图省事跳过任何一步,否则上线第一天就等着报警吧。

环境准备核心逻辑框架 日志采集环境准备 操作系统 Java 运行时 Node.js 运行时 网络 / 防火墙 CentOS / Ubuntu / Windows 最小化安装 + 内核参数调优 关闭 SELinux / 配置时区 JDK 8 / 11 / 17 设置 JAVA_HOME 避免 yum 默认安装 LTS 版本 + npm/yarn 配置国内镜像源 避免 root 运行 放通 5044/9600/9200 iptables / firewalld 双向连通性验证 温馨提示:后续所有采集器部署都依赖本章环境的正确性

4.1 操作系统选型与基本配置

我个人习惯用 CentOS Stream 或者 Ubuntu LTS,稳。Windows Server 也能跑采集器,只不过生产环境里我还是推荐 Linux,少折腾。

4.1.1 Linux 环境(CentOS / Ubuntu)

安装时我建议选最小化安装,别带图形界面。你想想看,一个采集节点上跑GNOME,那不是浪费资源吗?

装完系统后,这几件事必须做:

  1. 关闭 SELinux(或设为 permissive)—— 我遇到过SELinux拦截Logstash写数据文件,查了两小时才反应过来。
  2. 配置 NTP 时间同步—— 日志时间戳差几秒,排查问题能让你疯掉。
  3. 调整系统限制(ulimit -n 65535)—— 采集器要打开大量文件描述符。
  4. 设置时区为 UTC+8(或统一时区)—— 这是血的教训。

我曾经在项目里跳过时间同步这步,结果ELK里的日志时间乱成一锅粥。后来写了个脚本,每天凌晨强制同步,再也没出过问题。别不信,早晚会踩这个坑。

4.1.2 Windows Server 环境

Windows 上主要跑 Filebeat 或者 Winlogbeat。配置要点不多,但有一个常见的坑:

  • 确保 .NET Framework 4.5+ 已安装(Winlogbeat依赖)
  • 关闭 Windows 防火墙对采集端口的影响
  • 以管理员身份安装服务(否则注册不了 Windows Event Log 读取权限)

我记得有一次,Winlogbeat 装了但读不到安全日志,折腾半天——没以管理员运行安装程序。这个真要注意。

4.2 Java 运行环境安装

采集全家桶里,Logstash 和 Kafka 都跑在 JVM 上。Java 版本不统一,后面全是兼容性问题。

4.2.1 版本选择

采集器 / 中间件 推荐 JDK 版本 说明
Logstash 7.x JDK 11 官方从7.0开始推荐JDK 11
Logstash 8.x JDK 17 JDK 8已停用
Kafka 2.8+ JDK 11 或 17 JDK 8 也能跑,但官方建议升级
Elasticsearch 7.x/8.x JDK 17(内置) 自带 JDK,但系统环境变量别冲突

4.2.2 安装步骤(以 JDK 17 为例)

坦白讲,我不建议用 yum install java 或者 apt install default-jdk。为什么?因为你控制不了具体版本。我习惯从官网下载 tar.gz 手动安装。

# 1. 下载 JDK 17(以 Linux x64 为例)
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz

# 2. 解压并移动到 /usr/local
tar -xzf jdk-17_linux-x64_bin.tar.gz
sudo mv jdk-17.0.x /usr/local/jdk17

# 3. 配置环境变量
cat >> ~/.bashrc << EOF
export JAVA_HOME=/usr/local/jdk17
export PATH=$JAVA_HOME/bin:$PATH
EOF

source ~/.bashrc

# 4. 验证
java -version
# 输出应为:openjdk version "17.0.x" 

避坑提醒:安装后检查一下 /etc/alternatives/java 的软链接。我曾经见新同事直接 yum install java,结果装了 OpenJDK 8,但我们的采集器要求 JDK 11 以上,启动直接报错。

4.3 Node.js 运行环境安装

Node.js 在日志采集领域主要服务 Filebeat 的自定义扩展以及一些轻量级采集网关。我用 Node.js 写过几个 HTTP 接收端,性能还不错。

4.3.1 版本选择

我建议统一用 LTS 版本。当前 LTS 是 18.x 或者 20.x,别追新。为什么?因为有些采集插件还没适配高版本。我一同事追新装了 Node 22,结果一个老项目跑不起来,周末加班降级……这事我记得很清楚。

4.3.2 安装方式

我个人最推荐用 nvm 管理 Node 版本,尤其在多项目场景下。但也有人喜欢直接用官方二进制包,看团队习惯。

# 方式一:nvm 安装(推荐)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
node -v  # v18.16.0

# 方式二:官方二进制包
wget https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz
tar -xJf node-v18.16.0-linux-x64.tar.xz
sudo mv node-v18.16.0-linux-x64 /usr/local/node18
export PATH=/usr/local/node18/bin:$PATH
node -v

4.3.3 npm 镜像配置

在国内用 npm 默认源,慢得你想砸电脑。我习惯换成淘宝源:

npm config set registry https://registry.npmmirror.com/

核心原则:Node.js进程不要用 root 用户启动。我曾经犯过这个错误——用 root 跑采集网关,结果被黑客注入了恶意脚本。后来强制所有 Node 服务用普通用户运行,容器化就更安全了。

4.4 网络与防火墙配置

环境搭好了,网络不通等于白搭。日志采集整体模型很简单——采集器(Beats / Logstash)把数据发到中间层(Kafka / Redis)或者存储层(Elasticsearch)。每层之间都需要网络畅通。

4.4.1 必须放通的端口清单

组件 默认端口 协议 说明
Filebeat → Logstash 5044 TCP Beats 输入协议
Logstash → Elasticsearch 9200 HTTP REST API 写入
Kafka 客户端 9092 TCP 生产者/消费者连接
Elasticsearch 节点间 9300 TCP 集群内部传输

4.4.2 Linux 防火墙(firewalld)配置示例

CentOS 7+ 默认用 firewalld,Ubuntu 用 ufw。这里给 CentOS 的例子:

# 放通 5044 端口(Filebeat → Logstash)
firewall-cmd --permanent --add-port=5044/tcp

# 放通 9200 端口(Logstash/查询 → Elasticsearch)
firewall-cmd --permanent --add-port=9200/tcp

# 放通 9092 端口(Kafka 客户端)
firewall-cmd --permanent --add-port=9092/tcp

# 重载配置
firewall-cmd --reload

# 验证
firewall-cmd --list-ports

4.4.3 Windows 防火墙配置

Windows 上用 netsh advfirewall 命令:

# 开放 5044 端口(入站)
netsh advfirewall firewall add rule name="Logstash_5044" dir=in action=allow protocol=TCP localport=5044

# 开放 9200 端口
netsh advfirewall firewall add rule name="ES_9200" dir=in action=allow protocol=TCP localport=9200

我曾经在客户现场碰到一件事——Kafka 的 9092 端口明明放通了,但 Logstash 就是连不上。排查了俩小时,才发现是服务器的 iptables 还有一条 DROP 规则在 firewalld 之前。所以,配置完防火墙后一定要用 telnet 或者 nc -vz 双向验证。

验证命令:
telnet <目标IP> 5044 或 nc -vz <目标IP> 5044

4.5 环境验证清单

所有环境配好之后,我习惯过一遍这个清单,确认没问题再往下走。别嫌啰嗦,这一步能帮你省掉后面80%的部署问题。

检查项 验证命令 期望结果
JDK 版本 java -version 至少 JDK 11,推荐 17
JAVA_HOME echo $JAVA_HOME 指向 JDK 安装目录
Node.js 版本 node -v LTS 版本 18.x 或 20.x
npm 镜像 npm config get registry 国内镜像地址
端口放通 telnet <目标IP> 5044 连接成功
时间同步 timedatectl NTP 服务 active,时区正确

小技巧:保存一个环境验证脚本,每次部署新节点直接跑一遍。我团队现在就这么干,省心。

环境准备到位了,后面部署采集工具就是顺水推舟的事。