Apache NiFi 2.9.0 部署手册
本文结合,手动部署 + AI总结,所有命令真实可用,绝非AI捏造未经验证,请放心食用

一、环境概览
| 项目 | 说明 |
|---|---|
| 操作系统 | Linux(CentOS/RHEL 系) |
| 服务器 IP | 10.29.40.82 |
| SSH 跳板机 | 10.180.116.100:2001(不能直连目标服务器 SSH) |
| JDK 版本 | Dragonwell 21(路径 /app/jdk21) |
| NiFi 版本 | 2.9.0(路径 /app/nifi-2.9.0) |
| 访问协议 | HTTPS |
| HTTPS 端口 | 8443 |
| 内存配置 | JVM Heap -Xms1g -Xmx1g |
二、SSH 连接方式
目标服务器 10.29.40.82 不能直接 SSH,必须通过跳板机 10.180.116.100 的 2001 端口 跳转。
2.1 准备私钥
将 ssh.key 保存到本地,Windows 下需修复文件权限(SSH 不允许私钥被其他用户读取):
powershell
# Windows PowerShell(管理员)
icacls "C:\path\to\ssh.key" /inheritance:r
icacls "C:\path\to\ssh.key" /grant:r "$env:USERNAME:R"
2.2 连接命令
bash
ssh -i /path/to/ssh.key \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
-p 2001 root@10.180.116.100
说明 :
10.180.116.100:2001实际是端口转发,登录后直接进入目标服务器LXJS-imes-lz-ap02,用户为root。
2.3 远程执行命令示例
bash
# 查看 NiFi 进程
ssh -i ssh.key -p 2001 root@10.180.116.100 'ps -ef | grep nifi | grep -v grep'
# 查看日志
ssh -i ssh.key -p 2001 root@10.180.116.100 'tail -100 /app/nifi-2.9.0/logs/nifi-app.log'
三、目录结构
/app/
├── jdk21/ # Dragonwell JDK 21
└── nifi-2.9.0/ # NiFi 安装目录
├── bin/
│ └── nifi.sh # 启停脚本
├── conf/
│ ├── nifi.properties # 主配置文件
│ ├── bootstrap.conf # JVM 启动参数
│ ├── login-identity-providers.xml # 认证配置
│ ├── keystore.p12 # HTTPS 证书(PKCS12)
│ └── truststore.p12 # 信任库(PKCS12)
├── lib/
├── content_repository/ # 内容仓库(运行时自动创建)
├── flowfile_repository/ # FlowFile 仓库
├── provenance_repository/ # 数据溯源仓库
└── logs/
├── nifi-app.log # 应用主日志
└── nifi-bootstrap.log # 启动引导日志
四、关键配置项
配置文件路径:/app/nifi-2.9.0/conf/nifi.properties
4.1 Web 访问配置
properties
# HTTPS 绑定地址(0.0.0.0 表示监听所有网卡)
nifi.web.https.host=0.0.0.0
nifi.web.https.port=8443
# HTTP 端口留空表示禁用 HTTP
nifi.web.http.port=
# 代理主机(外部访问地址,含端口)
nifi.web.proxy.host=10.29.40.82:8443,localhost:8443,LXJS-imes-lz-ap02:8443
4.2 证书配置
properties
nifi.security.keystore=./conf/keystore.p12
nifi.security.keystoreType=PKCS12
nifi.security.keystorePasswd=916bebe5988d8c259b12125f17534311
nifi.security.truststore=./conf/truststore.p12
nifi.security.truststoreType=PKCS12
nifi.security.truststorePasswd=4638380936819df293abb22aa11411b8
4.3 敏感属性密钥
properties
# 用于加密 flow 中的敏感信息(密码等),至少 12 位
nifi.sensitive.props.key=g6%-kQKb4y^o+gbO
注意:此密钥一旦设置不要随意更改,否则已加密的 flow 敏感属性将无法解密。
4.4 JVM 内存配置
配置文件:/app/nifi-2.9.0/conf/bootstrap.conf
properties
# 默认 1g,可根据服务器内存调整
java.arg.2=-Xms1g
java.arg.3=-Xmx1g
五、启停操作
执行前需设置 JAVA_HOME(非交互式 SSH 不会自动加载
/etc/profile.d/PATH.sh):
bash
export JAVA_HOME=/app/jdk21
export PATH=$JAVA_HOME/bin:$PATH
5.1 启动
bash
cd /app/nifi-2.9.0
./bin/nifi.sh start
5.2 停止
bash
cd /app/nifi-2.9.0
./bin/nifi.sh stop
5.3 查看状态
bash
./bin/nifi.sh status
ps -ef | grep org.apache.nifi.NiFi | grep -v grep
5.4 前台运行(调试用)
bash
./bin/nifi.sh run
5.5 查看日志
bash
# 实时跟踪应用日志
tail -f /app/nifi-2.9.0/logs/nifi-app.log
# 查看启动引导日志
tail -f /app/nifi-2.9.0/logs/nifi-bootstrap.log
六、首次登录
6.1 获取初始账号密码
NiFi 首次启动时会自动生成用户名和密码,记录在日志中:
bash
grep "Generated" /app/nifi-2.9.0/logs/nifi-app.log
输出示例:
Generated Username [656ba24e-538c-4554-b945-812e66235c94]
Generated Password [QPpTBIAb3z6JjpkGzN+6meMW1Lh/fBgf]
6.2 访问地址
https://10.29.40.82:8443/nifi
自签名证书会提示不安全,点击"高级 → 继续前往"即可。
6.3 修改默认账号密码
bash
cd /app/nifi-2.9.0
./bin/nifi.sh set-single-user-credentials <新用户名> <新密码>
# 然后重启
./bin/nifi.sh stop && ./bin/nifi.sh start
七、常见问题(FAQ)
Q1:访问报 HTTP ERROR 400 Invalid SNI
现象 :浏览器访问 https://10.29.40.82:8443/ 返回 400 Invalid SNI。
原因 :NiFi 2.x 使用 Jetty 10,自动生成的证书 SAN(Subject Alternative Name)中只有 localhost 和主机名,不包含 IP 地址。用 IP 访问时浏览器发送的 SNI 是 IP,服务器证书中没有该 IP,Jetty 直接拒绝。
解决方法:重新生成包含 IP 的证书。
bash
export JAVA_HOME=/app/jdk21
export PATH=$JAVA_HOME/bin:$PATH
cd /app/nifi-2.9.0/conf
# 1. 备份旧证书
cp keystore.p12 keystore.p12.bak.$(date +%Y%m%d%H%M%S)
cp truststore.p12 truststore.p12.bak.$(date +%Y%m%d%H%M%S)
# 2. 删除旧 keystore,生成新证书(加入 IP SAN)
rm -f keystore.p12
keytool -genkeypair \
-alias generated \
-keyalg RSA -keysize 4096 -validity 3650 \
-keystore keystore.p12 -storetype PKCS12 \
-storepass 916bebe5988d8c259b12125f17534311 \
-keypass 916bebe5988d8c259b12125f17534311 \
-dname "CN=localhost, OU=NiFi, O=MyOrg, L=City, ST=State, C=CN" \
-ext "SAN=DNS:localhost,DNS:LXJS-imes-lz-ap02,IP:10.29.40.82,IP:127.0.0.1"
# 3. 导出证书并重建 truststore
keytool -exportcert -alias generated \
-keystore keystore.p12 -storetype PKCS12 \
-storepass 916bebe5988d8c259b12125f17534311 \
-file /tmp/nifi-cert.crt
rm -f truststore.p12
keytool -importcert -alias generated \
-file /tmp/nifi-cert.crt \
-keystore truststore.p12 -storetype PKCS12 \
-storepass 4638380936819df293abb22aa11411b8 -noprompt
# 4. 重启 NiFi
cd /app/nifi-2.9.0
./bin/nifi.sh stop && ./bin/nifi.sh start
注意 :密码需与
nifi.properties中nifi.security.keystorePasswd和nifi.security.truststorePasswd保持一致,否则无需改配置。
Q2:启动失败,提示 JAVA_HOME not set 或 java command not found
原因 :非交互式 SSH 登录不会加载 /etc/profile.d/PATH.sh,导致 java 不在 PATH 中。
解决方法:执行 NiFi 命令前手动设置环境变量:
bash
export JAVA_HOME=/app/jdk21
export PATH=$JAVA_HOME/bin:$PATH
也可以在
nifi.sh开头或/etc/profile中固化。
Q3:启动失败,日志报 Java 版本不兼容
现象 :UnsupportedClassVersionError 或类似错误。
原因 :NiFi 2.x 强制要求 Java 21,不支持 Java 8/11/17。
验证:
bash
/app/jdk21/bin/java -version
# 应输出 openjdk version "21.x.x"
Q4:忘记登录密码怎么办
解决方法:重置单用户凭证后重启:
bash
cd /app/nifi-2.9.0
./bin/nifi.sh set-single-user-credentials admin 你的新密码
./bin/nifi.sh stop && ./bin/nifi.sh start
Q5:启动后访问一直转圈或 502
排查步骤:
- 确认进程是否存活:
ps -ef | grep nifi - 查看 bootstrap 日志:
tail -50 logs/nifi-bootstrap.log - 查看应用日志是否有异常:
tail -100 logs/nifi-app.log | grep -i error - 确认端口监听:
netstat -tlnp | grep 8443 - 首次启动需要 30~60 秒初始化,耐心等待
Q6:如何验证证书 SAN 是否包含 IP
bash
/app/jdk21/bin/keytool -list -v \
-keystore /app/nifi-2.9.0/conf/keystore.p12 \
-storepass 916bebe5988d8c259b12125f17534311 \
-storetype PKCS12 | grep -A5 "SubjectAlternativeName"
正常输出应包含:
SubjectAlternativeName [
DNSName: localhost
DNSName: LXJS-imes-lz-ap02
IPAddress: 10.29.40.82
IPAddress: 127.0.0.1
]
Q7:磁盘空间不足
NiFi 的 content_repository 和 provenance_repository 会随数据量增长。查看磁盘:
bash
df -h /app
du -sh /app/nifi-2.9.0/*_repository
可在 nifi.properties 中调整仓库容量阈值:
properties
nifi.content.repository.archive.max.bytes=...
nifi.provenance.repository.max.storage.time=24 hours
nifi.provenance.repository.max.storage.size=1 GB
Q8:需要新增域名/IP 访问
如果后续需要通过其他域名或 IP 访问,重新生成证书时在 -ext "SAN=..." 中追加即可:
bash
-ext "SAN=DNS:localhost,DNS:LXJS-imes-lz-ap02,IP:10.29.40.82,IP:127.0.0.1,DNS:nifi.example.com,IP:其他IP"
同时更新 nifi.web.proxy.host。
八、运维速查表
| 操作 | 命令 |
|---|---|
| 启动 | cd /app/nifi-2.9.0 && ./bin/nifi.sh start |
| 停止 | ./bin/nifi.sh stop |
| 重启 | ./bin/nifi.sh stop && ./bin/nifi.sh start |
| 查看状态 | ./bin/nifi.sh status |
| 实时日志 | tail -f logs/nifi-app.log |
| 查看进程 | `ps -ef |
| 查看端口 | `netstat -tlnp |
| 重置密码 | ./bin/nifi.sh set-single-user-credentials <user> <pass> |
| 登录地址 | https://10.29.40.82:8443/nifi |
九、备份建议
定期备份以下文件/目录:
| 备份项 | 路径 | 说明 |
|---|---|---|
| 配置文件 | /app/nifi-2.9.0/conf/ |
nifi.properties、证书等 |
| Flow 定义 | /app/nifi-2.9.0/conf/flow.xml.gz |
数据流编排(如有) |
| 日志 | /app/nifi-2.9.0/logs/ |
按需归档 |
重要 :备份时请同时记录
nifi.sensitive.props.key的值,否则换环境后无法解密 flow 中的敏感属性。