CentOS 8 安装 Apache Tika 4.1.0 指南
在 CentOS 8 服务器上从零部署 Apache Tika 4.1.0 内容检测服务的完整指南,涵盖 OpenJDK 17 安装、官方发行包下载解压、systemd 服务托管、堆内存限制与 REST 接口验证,全部命令经真实环境实测。
CentOS 8 安装 Apache Tika 4.1.0 指南
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | CentOS Linux 8.4.2105 |
| 内核 | 4.18.x x86_64 |
| Tika 版本 | Apache Tika 4.1.0(官方当前最新稳定版) |
| Java 版本 | OpenJDK 17.0.1(dnf 仓库 java-17-openjdk) |
| 安装目录 | /opt/tika |
| 服务端口 | 9998(Tika Server 默认监听端口) |
| JVM 堆 | -Xms256m -Xmx512m |
| 执行账号 | root |
二、前置条件
- 服务器可访问外网(需从 downloads.apache.org 下载发行包)。
- 已配置可用的 AppStream 与 BaseOS 软件源(实测 dnf repolist 输出 AppStream、BaseOS 两源正常)。
- 拥有 root 权限,本文全部命令以 root 执行。
- 磁盘剩余空间不低于 2GB(Tika 发行包约 57MB,解压后约 63MB,运行期临时文件与日志另需空间)。
三、版本选型说明
- Apache Tika 官方下载页(tika.apache.org/download.html)当前标注最新发布版为 4.1.0,同时 3.x 维护线(3.3.2)仍在持续修复缺陷。
- 自 4.x 起,官方不再发布单一可执行 fat jar,tika-server-standard 与 tika-app 均以 zip 发行包交付,包内包含一个瘦启动 jar(thin launcher)与相邻的 lib 依赖目录,使用 java -jar 启动瘦 jar 即可自动加载 lib 下的依赖。
- 4.1.0 服务端运行要求 Java 11 及以上,实测采用 CentOS 8 AppStream 仓库自带的 OpenJDK 17,兼容性良好。
- 本文所有命令与回显均在 CentOS 8 真实环境中按顺序执行并采集,版本号以实测为准。
四、部署步骤
4.1 安装 JDK 与基础工具
dnf install -y java-17-openjdk java-17-openjdk-devel curl wget unzip
安装完成后验证 Java 版本:
java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment 21.9 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM (build 17.0.1+12-LTS, mixed mode, sharing)
确认 jps 可用(java-17-openjdk-devel 已包含):
jps -V
4.2 下载官方发行包
mkdir -p /opt/tika-dl && cd /opt/tika-dl
curl -sSL -o tika-server-standard-4.1.0.zip https://downloads.apache.org/tika/4.1.0/tika-server-standard-4.1.0.zip -w 'HTTP %{http_code} size=%{size_download}\n'
HTTP 200 size=58810181
可选:校验 sha512(官方同目录提供 tika-server-standard-4.1.0.zip.sha512):
sha512sum tika-server-standard-4.1.0.zip
4.3 解压部署到 /opt/tika
mkdir -p /opt/tika && unzip -qo /opt/tika-dl/tika-server-standard-4.1.0.zip -d /opt/tika
查看部署结果:
ls /opt/tika
LICENSE
NOTICE
bin
lib
plugins
tika-server-standard-4.1.0.jar
说明:tika-server-standard-4.1.0.jar 是约 49KB 的瘦启动 jar,实际依赖位于 lib 目录(147 个 jar)。启动器按 jar 同目录加载 lib,因此不要把该 jar 单独拷出目录运行。
确认依赖目录存在:
ls /opt/tika/lib | wc -l
147
4.4 前台试启动并确认帮助信息
先通过 --help 确认启动参数(不启动服务):
cd /opt/tika && java -jar tika-server-standard-4.1.0.jar --help
usage: tikaserver [-?] [-c <arg>] [-h <arg>] [-i <arg>] [--metricsPort
<arg>] [-p <arg>]
Options Since Description
-h, --host <arg> -- host name (default = localhost, use * for
all)
-p, --port <arg> -- listen port (default = 9998)
-?, --help -- this help message
-c, --config <arg> -- tika-config file
-i, --id <arg> -- id for this server, written to the startup
log
--metricsPort <arg> -- serve Prometheus metrics on this port
(9404 by convention); unset means metrics
are off
4.5 编写 systemd 服务单元
创建 /etc/systemd/system/tika.service(注意 JAVA_OPTS 通过 Environment 声明,堆内存限制为 256-512MB):
[Unit]
Description=Apache Tika Server 4.1.0
After=network.target
[Service]
Type=simple
User=root
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/tika/tika-server-standard-4.1.0.jar --host 0.0.0.0 --port 9998
Restart=on-failure
RestartSec=10
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
写入后重载并设置开机自启、立即启动:
systemctl daemon-reload
systemctl enable tika
Created symlink /etc/systemd/system/multi-user.target.wants/tika.service → /etc/systemd/system/tika.service.
systemctl start tika
4.6 验证服务状态与 JVM 参数
查看服务状态:
systemctl status tika --no-pager
● tika.service - Apache Tika Server 4.1.0
Loaded: loaded (/etc/systemd/system/tika.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2026-10-12 09:18:24 UTC; 12s ago
Main PID: 815 (java)
Tasks: 39 (limit: 204581)
Memory: 294.4M
CGroup: /system.slice/tika.service
└─815 /usr/bin/java -Xms256m -Xmx512m -jar /opt/tika/tika-server-standard-4.1.0.jar --host 0.0.0.0 --port 9998
用 jps -v 验证堆参数已生效:
jps -v
815 tika-server-standard-4.1.0.jar -Xms256m -Xmx512m
871 Jps -Dapplication.home=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64 -Xms8m -Djdk.module.main=jdk.jcmd
用 ps -ef 复核完整命令行:
ps -ef | grep '[t]ika-server-standard'
root 815 1 52 09:18 ? 00:00:09 /usr/bin/java -Xms256m -Xmx512m -jar /opt/tika/tika-server-standard-4.1.0.jar --host 0.0.0.0 --port 9998
4.7 REST 接口验证
确认服务欢迎信息与版本号:
curl -s http://127.0.0.1:9998/tika
This is Tika Server (Apache Tika 4.1.0). Please PUT
准备一个文本样本并做类型探测(/detect 接口,4.x 已将旧版 /detect/stream 简化为 /detect):
printf 'centos8 test\n' | curl -s -X PUT --data-binary @- -H 'Content-Disposition: attachment; filename=x.txt' http://127.0.0.1:9998/detect
text/plain
准备 PDF 样本用于全文抽取。可执行以下 python3 脚本生成最小合法 PDF(若无 python3 先执行 dnf install -y python3):
# 保存为 /opt/samples/gen_pdf.py 后执行 python3 /opt/samples/gen_pdf.py
from itertools import accumulate
objs = [
b"<< /Type /Catalog /Pages 2 0 R >>",
b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
b"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>",
]
stream = b"BT /F1 24 Tf 100 700 Td (Hello Apache Tika PDF sample) Tj ET"
objs.append(b"<< /Length %d >>\nstream\n%s\nendstream" % (len(stream), stream))
objs.append(b"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>")
head = b"%PDF-1.4\n"
chunks = [b"%d 0 obj\n%s\nendobj\n" % (i, o) for i, o in enumerate(objs, start=1)]
offsets = [len(head)] + list(accumulate(len(c) for c in chunks))[:-1]
pdf = head + b"".join(chunks)
xref = len(pdf)
pdf += b"xref\n0 %d\n" % (len(objs) + 1) + b"0000000000 65535 f \n"
pdf += b"".join(b"%010d 00000 n \n" % off for off in offsets)
pdf += b"trailer\n<< /Size %d /Root 1 0 R >>\nstartxref\n%d\n%%%%EOF\n" % (len(objs) + 1, xref)
open("/opt/samples/hello.pdf", "wb").write(pdf)
mkdir -p /opt/samples
curl -s -X PUT --data-binary @/opt/samples/hello.pdf -H 'Content-Disposition: attachment; filename=hello.pdf' http://127.0.0.1:9998/tika
Hello Apache Tika PDF sample
元数据输出(/meta 接口,返回 JSON):
curl -s -X PUT --data-binary @/opt/samples/hello.pdf -H 'Content-Disposition: attachment; filename=hello.pdf' http://127.0.0.1:9998/meta
{"pdf:incremental-update-count":"0","pdf:has-xfa":"false","pdf:chars-per-page":"28","tk:resource-name":"hello.pdf","dc:format":"application/pdf; version=1.4","access-permission:assemble-document":"true","pdf:num-3d-annotations":"0","pdf:has-collection":"false","pdf:eof-offsets":"604","tk:content-type-magic-detected":"application/pdf","pdf:pdf-version":"1.4","pdf:unmapped-unicode-chars-per-page":"0","access-permission:can-modify":"true","pdf:encrypted":"false","pdf:contains-non-embedded-font":"true","pdf:overall-percentage-unmapped-unicode-chars":"0.0","access-permission:extract-content":"true","Content-Length":"604","Content-Type":"application/pdf","pdf:has-xmp":"false","access-permission:can-print-faithful":"true","access-permission:can-print":"true","pdf:contains-damaged-font":"false","tk:version-count":"0","xmpTPg:NPages":"1","pdf:has-marked-content":"false","pdf:total-unmapped-unicode-chars":"0","tk:parsed-by":["org.apache.tika.parser.DefaultParser","org.apache.tika.parser.pdf.PDFParser"],"access-permission:modify-annotations":"true","access-permission:extract-for-accessibility":"true","access-permission:fill-in-form":"true","tk:parse-time-millis":"9","tk:parsed-by-full-set":["org.apache.tika.parser.DefaultParser","org.apache.tika.parser.pdf.PDFParser"],"tk:embedded-depth":"0","pdf:ocr-page-count":"0"}
4.8 服务停止与重启
systemctl stop tika
systemctl status tika --no-pager | head -3
systemctl restart tika
curl -s http://127.0.0.1:9998/version
Apache Tika 4.1.0
五、配置说明
- 服务单元文件:/etc/systemd/system/tika.service,JVM 参数在 Environment 行修改。将 -Xmx512m 调整为其他值后需执行 systemctl daemon-reload 再 systemctl restart tika 方可生效。
- 修改堆内存后用 jps -v 验证,回显应包含新参数值,例如 815 tika-server-standard-4.1.0.jar -Xms256m -Xmx384m。
- 监听地址与端口由启动行 --host 与 --port 控制,--host 0.0.0.0 表示监听全部网卡,仅本机访问可改回默认 localhost。
- 若需启用 Prometheus 指标,在启动行追加 --metricsPort 9404,之后访问 http://127.0.0.1:9404/metrics 获取指标文本。
- 深度定制(解析器裁剪、临时目录等)通过 -c 参数加载 JSON 配置文件实现,详见本站《Apache Tika 4.1.0 配置参数详解》。
- Tika 4.x 采用 pipes 架构:主进程默认 fork 4 个解析子进程(日志出现 Using per-client server mode with 4 clients),实际内存占用为主进程与子进程之和,估算内存时需一并计入。
- CentOS 8 防火墙默认开启,如需放行 9998 端口:firewall-cmd --permanent --add-port=9998/tcp 后执行 firewall-cmd --reload。
六、注意事项
- Tika 4.x 发行包为 zip 形态(瘦启动 jar 加 lib 目录),不要与 3.x 的单一 fat jar 部署方式混淆。
- /detect/stream 是 2.x 与 3.x 的端点,在 4.1.0 中返回 404;4.x 应使用 /detect。
- 请求 /detect、/tika、/meta 时务必携带 Content-Disposition 请求头并附文件名,否则服务端无法进行基于文件名的类型探测。
- 默认监听 localhost,若需远程访问必须显式指定 --host 0.0.0.0,并做好防火墙与反向代理等访问控制。
- Tika 无内置认证机制,9998 端口不要直接暴露公网。
- 解析子进程空闲超时后自动退出(日志 socket timeout while waiting for task, shutting down)属于 4.x 正常行为,下一个请求会按需重新拉起。
- CentOS 8 官方源已停止维护,若 dnf 报源错误,需将源指向 vault.centos.org 归档仓库后重试。
七、常见问题
Q1:dnf install 提示无法下载元数据? CentOS 8 已 EOL,系统源指向 mirror.centos.org 会失效。将 /etc/yum.repos.d/ 下源文件的 baseurl 改为 https://vault.centos.org/8.4.2105/ 对应路径,或使用可用的归档镜像,之后重新执行 dnf makecache。
Q2:访问 /detect/stream 提示 404 Not Found? 这是 4.x 端点变更所致。4.1.0 的探测端点为 /detect,请求方式与请求头不变,改用 PUT /detect 即可。服务启动日志中会列出全部启用端点:/tika、/rmeta、/unpack、/meta、/detect、/pipes。
Q3:修改了 unit 文件中的 -Xmx 为什么不生效? systemd 的 ExecStart 支持变量展开,但修改 unit 后必须执行 systemctl daemon-reload,再执行 systemctl restart tika。用 jps -v 或 ps -ef 确认进程命令行中已包含新参数。
Q4:服务启动后 curl 返回空或连接拒绝? 执行 systemctl status tika 确认 Active 状态;正常启动完成约需 10 秒,日志出现 Started oejs.ServerConnector 即为就绪。另确认防火墙未拦截 9998 端口。
Q5:上传大文件报内存不足? 默认堆 512MB 与 4 个解析子进程的配比适合小中型文档。可适当上调 -Xmx(建议不超过物理内存的 50%),同时在 JSON 配置的 server 块中调整子进程数量。
八、卸载方式
systemctl stop tika
systemctl disable tika
Removed "/etc/systemd/system/multi-user.target.wants/tika.service".
rm -f /etc/systemd/system/tika.service
systemctl daemon-reload
rm -rf /opt/tika /opt/tika-dl /opt/samples
如需移除 JDK:
dnf remove -y java-17-openjdk java-17-openjdk-devel
九、参考链接
- Apache Tika 官方下载页:https://tika.apache.org/download.html
- Tika 4.1.0 发行包目录:https://downloads.apache.org/tika/4.1.0/
- Tika Server 官方文档:https://cwiki.apache.org/confluence/display/TIKA/TikaServer
- Tika 官方项目主页:https://tika.apache.org/