第四章 环境准备
做日志采集,环境没搭好,后面全是坑。我见过不少团队,工具选得挺好,部署上去却跑不起来——排查半天发现是JDK版本不对,或者防火墙把端口掐了。
这章我带你把基础环境捋一遍。说白了,就是把操作系统、Java、Node.js、网络和防火墙这四件事搞定。每一步都有我的血泪教训,你照着来,能省不少事。
核心原则:环境版本统一、路径规范、防火墙最小开放。别图省事跳过任何一步,否则上线第一天就等着报警吧。
4.1 操作系统选型与基本配置
我个人习惯用 CentOS Stream 或者 Ubuntu LTS,稳。Windows Server 也能跑采集器,只不过生产环境里我还是推荐 Linux,少折腾。
4.1.1 Linux 环境(CentOS / Ubuntu)
安装时我建议选最小化安装,别带图形界面。你想想看,一个采集节点上跑GNOME,那不是浪费资源吗?
装完系统后,这几件事必须做:
- 关闭 SELinux(或设为 permissive)—— 我遇到过SELinux拦截Logstash写数据文件,查了两小时才反应过来。
- 配置 NTP 时间同步—— 日志时间戳差几秒,排查问题能让你疯掉。
- 调整系统限制(
ulimit -n 65535)—— 采集器要打开大量文件描述符。 - 设置时区为 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,时区正确 |
小技巧:保存一个环境验证脚本,每次部署新节点直接跑一遍。我团队现在就这么干,省心。
环境准备到位了,后面部署采集工具就是顺水推舟的事。