写在前面
做企业信息化这几年,"文件在线预览"这个需求几乎每个项目都会碰到。合同审批要预览 pdf,oa 系统要看 word 附件,网盘要支持 excel 和 ppt 的即时查看——如果每次都让用户把文件下载到本地再打开,体验差是一方面,更关键的是存在文件外泄的安全隐患。
kkfileview 是目前国内用得最多的一款开源文件在线预览方案,基于 spring boot 构建,支持 office 全家桶、pdf、图片、音视频、压缩包、cad 图纸等几十种格式,部署起来也不复杂。但说实话,官方文档写得比较"骨感",真正到生产环境落地的时候,字体问题、配置调优、nginx 代理、容器编排这些细节,文档里基本没怎么展开。
这篇文章就是我把自己前后折腾了好几套环境的经验整理出来的,从一台全新的 linux 服务器开始,一步步把 kkfileview 跑起来,跑稳,跑好。
一、先搞清楚 kkfileview 是什么、能干什么
kkfileview 的核心逻辑其实不复杂:你的业务系统把文件的访问 url 传给它,它在服务端把文件下载下来,用 libreoffice 做格式转换(比如 docx 转成 pdf,再转成 html 或图片),最后把转换结果通过浏览器渲染出来。整个过程对用户透明,用户只看到一个"打开即预览"的效果。
它支持的文件格式非常广,这里列几个大类:
- 办公文档 :doc、docx、xls、xlsx、ppt、pptx、wps、et、dps
- pdf 类 :pdf(含扫描件)
- 图片 :jpg、png、bmp、gif、tiff、webp、svg
- 文本 :txt、csv、xml、json、yml
- 压缩包 :zip、rar、7z、tar、gz
- 音视频 :mp3、mp4、avi、mov、flv、mkv
- cad/设计 :dwg、dxf、psd
- 其他 :markdown、epub、xmind
预览接口只有一个,核心参数就是文件的 url 地址(需要做 base64 编码)。这意味着它跟你的业务系统是松耦合的,不管你后端是 java、python 还是 go,只要能拼 url 就能对接。
二、服务器选型与基础要求
2.1 硬件配置建议
我按实际跑下来的经验给个参考:
| 场景 | cpu | 内存 | 磁盘 | 说明 |
|---|---|---|---|---|
| 开发/测试 | 2 核 | 4 gb | 20 gb | 够用,但别指望并发 |
| 小型生产(日活 < 200) | 4 核 | 8 gb | 50 gb | 推荐起步配置 |
| 中型生产(日活 200~1000) | 8 核 | 16 gb | 100 gb ssd | 建议 ssd,文件转换是 io 密集型 |
| 大型生产 | 按集群方案走 | 32 gb+ | 按需 | 需要多实例 + 负载均衡 |
有几个点要特别注意:
内存是最容易成为瓶颈的资源。 libreoffice 做文档转换的时候非常吃内存,一个 50 页的 word 转 pdf 可能瞬间吃掉 500mb 以上。如果同时来了五六个转换请求,4gb 内存的机器基本就扛不住了。我最初用 2gb 内存的测试机跑,稍微大一点的文件直接把容器 oom kill 了,后来加到 8gb 才稳定。
磁盘空间别省。 kkfileview 会把转换后的文件缓存在本地,如果你的业务量大、文件类型多,缓存目录会膨胀得很快。另外 docker 镜像本身、libreoffice 运行时产生的临时文件,都需要磁盘空间。建议至少预留 50gb,并且把缓存目录挂载到数据盘上。
2.2 操作系统选择
理论上任何能跑 docker 的 linux 发行版都行,但我个人推荐以下两个:
- ubuntu 22.04 lts :软件源新,docker 安装方便,社区资料多,出问题好搜。
- centos 7.9 / rocky linux 8/9 :如果你们公司基础设施统一用 centos 系,也完全可以。注意 centos 7 已经停止维护,新环境建议上 rocky linux 或 almalinux。
本文后续的命令会同时给出 ubuntu 和 centos 两个版本,你根据自己的系统选着看就行。
2.3 网络要求
- 服务器需要能访问外网(至少首次部署时需要,用于拉取 docker 镜像)。如果是纯内网环境,后面我会讲离线导入镜像的办法。
- 需要开放 8012 端口(kkfileview 默认端口),或者通过 nginx 代理后只开放 80/443。
三、操作系统初始化
拿到一台全新的服务器,别急着装东西,先把基础环境收拾干净。
3.1 更新系统软件包
# ubuntu / debian sudo apt update && sudo apt upgrade -y # centos / rocky linux sudo yum update -y # 或者 rocky linux 8/9 用 dnf sudo dnf update -y
3.2 安装基础工具
后面会用到 wget、curl、vim 这些工具,一次性装好:
# ubuntu sudo apt install -y curl wget vim htop net-tools unzip # centos sudo yum install -y curl wget vim htop net-tools unzip
3.3 关闭或配置防火墙
开发阶段可以暂时关闭防火墙,生产环境建议只开放需要的端口。
# ubuntu (ufw) sudo ufw allow 22/tcp # ssh sudo ufw allow 80/tcp # http sudo ufw allow 443/tcp # https sudo ufw allow 8012/tcp # kkfileview(如果不用 nginx 代理的话) sudo ufw enable # centos (firewalld) sudo systemctl start firewalld sudo systemctl enable firewalld sudo firewall-cmd --zone=public --add-port=22/tcp --permanent sudo firewall-cmd --zone=public --add-port=80/tcp --permanent sudo firewall-cmd --zone=public --add-port=443/tcp --permanent sudo firewall-cmd --zone=public --add-port=8012/tcp --permanent sudo firewall-cmd --reload
如果你用的是阿里云、腾讯云这类云服务器,除了系统防火墙,还要去云控制台的安全组里把对应端口放行,这一步很多人会忘。
3.4 设置时区(可选但建议)
sudo timedatectl set-timezone asia/shanghai
四、安装 docker
这是整个部署的核心前置步骤。kkfileview 的 docker 镜像里已经打包好了 jdk 1.8、libreoffice 以及所有运行时依赖,所以宿主机上不需要单独装 java 或 libreoffice。
4.1 一键安装(推荐)
docker 官方提供了一键安装脚本,适用于绝大多数 linux 发行版:
curl -fssl https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
如果你的服务器在国内,访问 docker 官方源可能比较慢,可以用阿里云的镜像脚本:
curl -fssl https://get.docker.com | bash -s docker --mirror aliyun
4.2 手动安装(ubuntu)
如果你更习惯手动控制安装过程:
# 卸载旧版本(如果有的话) sudo apt remove -y docker docker-engine docker.io containerd runc # 安装依赖 sudo apt install -y ca-certificates curl gnupg lsb-release # 添加 docker 官方 gpg 密钥 sudo mkdir -p /etc/apt/keyrings curl -fssl https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 添加软件源 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装 docker engine sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
4.3 手动安装(centos / rocky linux)
# 卸载旧版本
sudo yum remove -y docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖
sudo yum install -y yum-utils
# 添加 docker 软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
4.4 启动 docker 并设置开机自启
sudo systemctl start docker sudo systemctl enable docker
4.5 配置 docker 镜像加速(国内服务器强烈建议)
国内服务器直接拉 docker hub 的镜像,速度感人,经常超时。配一个镜像加速器能省很多事:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'eof'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
eof
sudo systemctl daemon-reload
sudo systemctl restart docker
注意:镜像加速站的可用性经常变化,如果上面的地址不好使,可以搜一下当前可用的加速地址替换进去。
4.6 将当前用户加入 docker 组
默认情况下,执行 docker 命令需要 sudo。把当前用户加到 docker 组里就不用每次都输密码了:
sudo groupadd docker 2>/dev/null sudo usermod -ag docker $user newgrp docker
执行完之后,需要退出当前终端重新登录 才能完全生效。验证一下:
docker run hello-world
能看到 “hello from docker!” 的输出就说明安装成功了。
4.7 验证 docker 版本
docker --version docker compose version
建议 docker engine 版本不低于 20.10.0,docker compose 不低于 v2.x。
五、关于 java 环境的说明
这里单独拿出来说一下,因为很多人会纠结"要不要在宿主机上装 java"。
结论是:如果你用 docker 部署 kkfileview,宿主机上不需要装 java。
kkfileview 的 docker 镜像内部已经包含了完整的 jdk 1.8 运行环境。容器是隔离的,它自己带自己的 java,跟宿主机没关系。
但如果你有以下情况,可能还是需要在宿主机装 java:
- 你打算用非 docker 方式部署(直接跑 jar 包)
- 你的服务器上还有其他 java 应用需要跑
- 你需要在宿主机上用 java 做一些辅助工作
如果有需要,安装方式如下:
# ubuntu sudo apt install -y openjdk-8-jdk # centos sudo yum install -y java-1.8.0-openjdk-devel # 验证 java -version
再次强调:docker 部署方案下,这一步可以跳过。
六、拉取并运行 kkfileview 容器
6.1 拉取镜像
docker pull keking/kkfileview:4.1.0
如果你不指定版本号,用 latest 也行,但我建议生产环境锁定版本号,避免某天自动更新导致不兼容:
# 也可以拉 latest docker pull keking/kkfileview
如果你的服务器无法访问外网 (纯内网环境),可以在有网的机器上先把镜像下载下来,然后传到内网服务器导入:
# 在有网的机器上下载离线包 wget https://kkview.cn/resource/kkfileview-4.1.0-docker.tar # 传到内网服务器后加载 docker load -i kkfileview-4.1.0-docker.tar
或者用 docker save 和 docker load 的方式:
# 有网机器上导出 docker save -o kkfileview-4.1.0.tar keking/kkfileview:4.1.0 # 内网机器上导入 docker load -i kkfileview-4.1.0.tar
6.2 创建必要的目录结构
在正式运行之前,先在宿主机上规划好目录结构。我建议统一放在 /data 或 /opt 下面:
sudo mkdir -p /data/kkfileview/config sudo mkdir -p /data/kkfileview/file sudo mkdir -p /data/kkfileview/logs sudo mkdir -p /data/kkfileview/fonts
各目录的用途:
config:存放 application.properties 配置文件file:存放预览产生的缓存文件logs:日志目录fonts:中文字体文件
6.3 首次启动:提取配置文件
第一次跑的时候,我们先用一个临时容器把默认的配置文件拷贝出来,方便后续修改:
# 启动一个临时容器 docker run -d --name kkfileview-temp keking/kkfileview:4.1.0 # 等几秒钟让容器完全启动,然后拷贝配置文件 docker cp kkfileview-temp:/opt/kkfileview-4.1.0/config/application.properties /data/kkfileview/config/ # 拷贝完成后删除临时容器 docker stop kkfileview-temp docker rm kkfileview-temp
注意:容器内的路径可能因版本不同而有差异。如果上面的路径不对,可以先 docker exec -it kkfileview-temp bash 进去 find / -name "application.properties" 找一下实际路径。4.4.0 版本的路径可能是 /opt/kkfileview-4.4.0/config/。
6.4 正式运行容器
基础启动命令:
docker run -d \ --name kkfileview \ -p 8012:8012 \ --restart=always \ keking/kkfileview:4.1.0
生产环境推荐启动命令(带配置挂载和资源限制):
docker run -d \ --name kkfileview \ -p 8012:8012 \ -v /data/kkfileview/config/application.properties:/opt/kkfileview-4.1.0/config/application.properties \ -v /data/kkfileview/file:/opt/kkfileview-4.1.0/file \ -v /data/kkfileview/logs:/opt/kkfileview-4.1.0/log \ -v /data/kkfileview/fonts:/usr/share/fonts/chinese \ -e kk_jvm_options="-xms1g -xmx2g -xx:maxdirectmemorysize=1g" \ --memory=4g \ --memory-swap=4g \ --restart=always \ keking/kkfileview:4.1.0
各参数含义逐一说明:
| 参数 | 作用 |
|---|---|
-d | 后台运行 |
--name kkfileview | 容器命名,方便后续管理 |
-p 8012:8012 | 端口映射,宿主机 8012 → 容器 8012 |
-v ...application.properties | 挂载自定义配置文件 |
-v .../file | 持久化预览缓存文件 |
-v .../log | 持久化日志 |
-v .../fonts | 挂载中文字体 |
-e kk_jvm_options | jvm 内存参数 |
--memory=4g | 容器最大内存限制 |
--restart=always | 容器异常退出或服务器重启后自动拉起 |
6.5 验证服务是否正常
# 查看容器状态 docker ps | grep kkfileview # 查看启动日志 docker logs -f kkfileview
日志里看到类似 started serverapplication in x.xxx seconds 的字样,说明服务已经起来了。
然后在浏览器里访问:
http://你的服务器ip:8012
能看到 kkfileview 的首页(有一个文件上传预览的演示界面),就说明部署成功了。
七、使用 docker compose 管理(推荐)
单个容器用 docker run 跑没问题,但如果你后续还要加 nginx、redis 之类的组件,或者想做更精细的配置管理,用 docker compose 会方便很多。所有配置写在一个 yml 文件里,一条命令启停,版本管理也方便。
7.1 编写 docker-compose.yml
mkdir -p /data/kkfileview && cd /data/kkfileview vim docker-compose.yml
写入以下内容:
version: '3.8'
services:
kkfileview:
image: keking/kkfileview:4.1.0
container_name: kkfileview
restart: always
ports:
- "8012:8012"
volumes:
- ./config/application.properties:/opt/kkfileview-4.1.0/config/application.properties
- ./file:/opt/kkfileview-4.1.0/file
- ./logs:/opt/kkfileview-4.1.0/log
- ./fonts:/usr/share/fonts/chinese
environment:
- kk_jvm_options=-xms1g -xmx2g -xx:maxdirectmemorysize=1g
deploy:
resources:
limits:
memory: 4g
reservations:
memory: 1g
healthcheck:
test: ["cmd", "curl", "-f", "http://localhost:8012"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"7.2 启动与管理
# 启动(后台运行) docker compose up -d # 查看状态 docker compose ps # 查看日志 docker compose logs -f kkfileview # 停止 docker compose down # 重启 docker compose restart # 更新镜像后重新创建容器 docker compose pull docker compose up -d
八、核心配置文件详解
kkfileview 的所有行为都由 application.properties 控制。前面我们已经把它从容器里拷出来了,路径在 /data/kkfileview/config/application.properties。
下面把生产环境中最常改的配置项拎出来说。
8.1 服务端口与上下文路径
# 服务端口,默认 8012,一般不用改 server.port=8012 # 上下文路径,如果你要通过 nginx 代理到某个子路径下,需要改这里 # 默认是 /,如果 nginx 代理路径是 /preview,这里就改成 /preview server.servlet.context-path=/
8.2 文件缓存目录
# 预览文件的存储路径,默认是程序根目录下的 file 目录 # 生产环境建议指向一个磁盘空间充裕的路径 file.dir=/opt/kkfileview-4.1.0/file
8.3 缓存过期时间
# 缓存过期时间(秒),默认 86400 即 24 小时 # 过期后再次预览会重新转换,如果文件很大转换会很慢 # 根据业务需要调整,设太长占磁盘,设太短影响体验 cache.expired.time=86400
8.4 是否开启文件上传功能
# kkfileview 首页有一个演示上传功能 # 生产环境强烈建议关掉,避免被人当文件中转站 file.upload.disable=false
8.5 信任主机配置(安全相关)
# 配置信任的主机,防止 ssrf 攻击 # 多个用英文逗号隔开 # 如果不配置,默认信任所有来源(不安全) trust.host=your-domain.com,192.168.1.0/24
这一项在对接业务系统的时候很重要。如果不限制,任何人都可以构造一个内网地址让 kkfileview 去请求,存在 ssrf 风险。
8.6 libreoffice 相关
# libreoffice 安装路径(docker 镜像里一般已经配好了,不用动) office.home=/opt/libreoffice7.1 # 预览服务端口(libreoffice 内部通信用的),默认 2002 office.port=2002 # 文档转换超时时间(毫秒),大文件可能需要调大 office.timeout=120000
8.7 修改配置后如何生效
因为配置文件是通过 -v 挂载进容器的,修改完宿主机的文件后,重启容器即可:
docker restart kkfileview # 或者用 compose docker compose restart kkfileview
九、中文字体安装(非常重要)
这个问题我必须单独拿出来讲,因为 90% 的人第一次部署完都会碰到 。
linux 系统默认不带中文字体,而 kkfileview 底层用 libreoffice 做文档转换,转换的时候如果找不到文档里用到的中文字体(宋体、微软雅黑、黑体等),预览出来就是一堆方块或者乱码。
9.1 获取字体文件
最方便的方式是从一台 windows 电脑上把字体拷出来。打开 c:\windows\fonts 目录,把常用的字体文件复制出来:
simsun.ttc(宋体)simhei.ttf(黑体)simkai.ttf(楷体)simfang.ttf(仿宋)msyh.ttc(微软雅黑)arial.ttf、times.ttf(英文基础字体,一般镜像里有)
另外,kkfileview 官方也提供了一个字体包可以直接下载:
wget http://kkfileview.keking.cn/fonts.zip unzip fonts.zip -d /data/kkfileview/fonts/
9.2 放置字体并刷新缓存
因为我们前面已经把 /data/kkfileview/fonts 挂载到了容器内的 /usr/share/fonts/chinese,所以字体文件放到宿主机目录后,还需要在容器内刷新字体缓存:
# 进入容器 docker exec -it kkfileview bash # 安装字体工具(如果容器里没有的话) apt-get update && apt-get install -y fontconfig # 刷新字体缓存 fc-cache -fv # 验证字体是否识别 fc-list | grep -i "sim" # 退出容器 exit
或者,更推荐的做法是把字体安装步骤固化下来,不用每次手动进容器操作。你可以在字体目录下放一个初始化脚本,或者直接重新构建一个自定义镜像(后面会讲)。
9.3 重启服务使字体生效
docker restart kkfileview
然后上传一个包含中文内容的 word 或 pdf 测试一下,确认显示正常。
9.4 补充说明
如果你的业务涉及 cad 图纸(dwg 文件),可能还需要额外的工程字体,比如 gbenor.shx、gbcbig.shx 这类 shx 字体,以及 simsun.ttc 等 truetype 字体。cad 字体缺失的表现跟文档乱码类似,都是文字变成方块。
十、nginx 反向代理配置
生产环境里,一般不会让用户直接访问 8012 端口。通常是前面挂一个 nginx,统一走 80 或 443 端口,顺便把 https、访问控制、负载均衡这些都做了。
10.1 安装 nginx
# ubuntu sudo apt install -y nginx # centos sudo yum install -y epel-release sudo yum install -y nginx # 启动并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx
10.2 基础 http 代理配置
创建配置文件:
sudo vim /etc/nginx/conf.d/kkfileview.conf
写入:
upstream kkfileview_backend {
server 127.0.0.1:8012;
keepalive 32;
}
server {
listen 80;
server_name preview.yourdomain.com;
# 如果需要自定义上下文路径,比如 /preview
# location /preview {
# proxy_pass http://kkfileview_backend/;
# }
location / {
proxy_pass http://kkfileview_backend;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-proto $scheme;
# 文件预览可能比较大,超时时间设长一点
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# 大文件上传/转换需要
client_max_body_size 200m;
}
}
检查配置并重载:
sudo nginx -t sudo systemctl reload nginx
10.3 https 配置(生产环境必做)
如果你有 ssl 证书(阿里云、腾讯云、let’s encrypt 都可以),配置如下:
# http 强制跳转 https
server {
listen 80;
server_name preview.yourdomain.com;
return 301 https://$server_name$request_uri;
}
# https 主配置
server {
listen 443 ssl http2;
server_name preview.yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
ssl_protocols tlsv1.2 tlsv1.3;
ssl_ciphers high:!anull:!md5;
ssl_session_cache shared:ssl:10m;
ssl_session_timeout 10m;
upstream kkfileview_backend {
server 127.0.0.1:8012;
keepalive 32;
}
location / {
proxy_pass http://kkfileview_backend;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-proto https;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
client_max_body_size 200m;
}
}
注意:如果配了 https,kkfileview 的
application.properties里有一项base.url需要同步改成https://preview.yourdomain.com,否则预览链接会拼错协议头。
10.4 使用子路径代理
如果你不想给 kkfileview 单独分配一个域名或子域名,想挂在主站的一个子路径下(比如 https://www.yourdomain.com/preview),需要同时改 nginx 和 kkfileview 的配置:
nginx 侧:
location /preview {
proxy_pass http://127.0.0.1:8012/;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-proto $scheme;
}
kkfileview 的 application.properties 侧:
server.servlet.context-path=/preview
容器启动时也需要传入环境变量:
docker run -d \ -e kk_base_url="https://www.yourdomain.com/preview" \ -e kk_context_path="/preview" \ -e kk_trust_host="www.yourdomain.com" \ -p 8012:8012 \ keking/kkfileview:4.1.0
十一、安全加固
kkfileview 作为一个文件预览服务,天然会接收到外部传入的 url,如果不做安全限制,可能被利用来做 ssrf 攻击或者被当作免费的文件转换工具。以下几点在生产环境中务必落实。
11.1 关闭演示上传页面
默认的首页有一个文件上传预览的演示功能,生产环境必须关掉:
# application.properties file.upload.disable=true
11.2 配置信任主机白名单
# 只允许来自这些域名的预览请求 trust.host=your-business-domain.com,another-domain.com
11.3 限制访问来源
通过 nginx 做 ip 白名单或者 basic auth:
location / {
# 只允许内网访问
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
proxy_pass http://kkfileview_backend;
# ... 其他 proxy 配置
}
11.4 容器安全
- 不要以
--privileged模式运行容器 - 限制容器内存(
--memory),防止恶意大文件把宿主机内存打满 - 定期更新镜像版本,关注 kkfileview 的 github 安全公告
11.5 定期清理缓存
预览缓存会持续占用磁盘空间,建议加一个定时清理任务:
# 创建清理脚本 cat > /data/kkfileview/clean_cache.sh << 'eof' #!/bin/bash # 清理 7 天前的缓存文件 find /data/kkfileview/file -type f -mtime +7 -delete echo "[$(date)] cache cleaned." >> /data/kkfileview/logs/clean.log eof chmod +x /data/kkfileview/clean_cache.sh # 添加 crontab 定时任务,每天凌晨 3 点执行 (crontab -l 2>/dev/null; echo "0 3 * * * /data/kkfileview/clean_cache.sh") | crontab -
十二、生产环境性能调优
12.1 jvm 参数调整
默认情况下容器内的 jvm 参数比较保守。如果你的服务器内存充裕,可以通过环境变量调大:
-e kk_jvm_options="-xms2g -xmx4g -xx:maxdirectmemorysize=1g -xx:+useg1gc"
参数说明:
-xms2g:初始堆内存 2gb-xmx4g:最大堆内存 4gb-xx:maxdirectmemorysize=1g:堆外内存上限-xx:+useg1gc:使用 g1 垃圾回收器,大内存场景下停顿更短
12.2 libreoffice 转换队列
kkfileview 内部维护了一个文档转换的任务队列。如果并发预览请求多,转换排队会很明显。可以关注以下配置:
# 转换任务超时时间(毫秒),大文件建议调大 office.timeout=300000 # 预览接口超时 server.tomcat.connection-timeout=300000
12.3 文件缓存策略
对于频繁预览的文件(比如公司制度文档、产品手册),第一次转换后缓存在本地,后续请求直接走缓存,速度很快。缓存的有效期由 cache.expired.time 控制。
如果你的文件更新频率低,可以把缓存时间设长一些,减少重复转换的开销:
# 缓存 7 天 cache.expired.time=604800
12.4 磁盘 io 优化
如果条件允许,把 /data/kkfileview/file 放到 ssd 上。文档转换过程中有大量的临时文件读写,机械硬盘会成为明显瓶颈。
十三、自定义镜像构建(进阶)
如果你需要把中文字体、自定义配置都打包进镜像,而不是每次启动都挂载一堆目录,可以自己构建一个镜像。这在多节点部署的时候特别有用——镜像里什么都有,拉下来直接跑。
13.1 编写 dockerfile
from keking/kkfileview:4.1.0 # 安装字体工具 run apt-get update && apt-get install -y fontconfig && rm -rf /var/lib/apt/lists/* # 拷贝中文字体 copy fonts/ /usr/share/fonts/chinese/ # 刷新字体缓存 run fc-cache -fv # 拷贝自定义配置文件(如果需要覆盖默认配置) # copy config/application.properties /opt/kkfileview-4.1.0/config/application.properties expose 8012
13.2 构建镜像
cd /data/kkfileview docker build -t my-kkfileview:4.1.0 .
13.3 使用自定义镜像启动
docker run -d \ --name kkfileview \ -p 8012:8012 \ -v /data/kkfileview/file:/opt/kkfileview-4.1.0/file \ -v /data/kkfileview/logs:/opt/kkfileview-4.1.0/log \ --restart=always \ my-kkfileview:4.1.0
字体已经内置在镜像里了,不用再额外 挂载。
十四、日常运维命令速查
把常用的操作整理在这里,方便日常查阅。
14.1 容器生命周期管理
# 查看运行状态 docker ps -a | grep kkfileview # 查看容器资源占用(cpu、内存实时数据) docker stats kkfileview --no-stream # 进入容器排查问题 docker exec -it kkfileview bash # 重启 docker restart kkfileview # 停止 docker stop kkfileview # 启动已停止的容器 docker start kkfileview # 删除容器(数据卷不受影响) docker stop kkfileview && docker rm kkfileview # 查看容器详细信息(ip、挂载、环境变量等) docker inspect kkfileview
14.2 日志查看
# 实时查看日志 docker logs -f kkfileview # 查看最近 200 行 docker logs --tail 200 kkfileview # 查看最近 1 小时的日志 docker logs --since 1h kkfileview
14.3 镜像管理
# 查看本地镜像 docker images | grep kkfileview # 拉取新版本 docker pull keking/kkfileview:4.4.0 # 删除旧镜像 docker rmi keking/kkfileview:4.1.0
14.4 版本升级
# 1. 停止并删除旧容器 docker stop kkfileview && docker rm kkfileview # 2. 拉取新镜像 docker pull keking/kkfileview:4.4.0 # 3. 用新镜像重新启动(注意版本号对应的路径可能变了) docker run -d \ --name kkfileview \ -p 8012:8012 \ -v /data/kkfileview/config/application.properties:/opt/kkfileview-4.4.0/config/application.properties \ -v /data/kkfileview/file:/opt/kkfileview-4.4.0/file \ -v /data/kkfileview/fonts:/usr/share/fonts/chinese \ --restart=always \ keking/kkfileview:4.4.0
升级前一定要看清楚新版本的容器内路径是否有变化,以及配置文件是否有新增/废弃的字段。
十五、常见问题排查
15.1 容器启动后立刻退出
# 先看退出原因 docker ps -a | grep kkfileview # 看 status 列 docker logs kkfileview # 看报错信息
常见原因:
- 端口被占用:
netstat -tlnp | grep 8012检查一下 - 内存不够:
free -h看看宿主机剩余内存 - 配置文件路径写错了:仔细核对
-v挂载的路径
15.2 预览中文文档出现方块/乱码
这是字体问题,回到第九节,确认:
- 字体文件确实放到了正确的目录
- 容器内执行了
fc-cache -fv - 重启了容器
15.3 预览大文件超时
- 调大
office.timeout的值 - 调大 nginx 的
proxy_read_timeout - 检查服务器内存是否充足
- 考虑把
cache.expired.time设长,让转换结果缓存住
15.4 预览接口返回 500
先看日志:
docker logs --tail 100 kkfileview
常见报错:
officeexception: could not open document:libreoffice 进程挂了,重启容器一般能解决filenotfoundexception:文件 url 不可达,检查业务系统传过来的 url 是否正确outofmemoryerror:内存不够,加大 jvm 堆或者加服务器内存
15.5 磁盘空间被缓存撑满
# 查看缓存目录大小 du -sh /data/kkfileview/file # 手动清理 find /data/kkfileview/file -type f -mtime +3 -delete
十六、对接业务系统
部署完成后,你的业务系统怎么调用呢?很简单,拼一个 url 就行。
16.1 预览接口格式
http://你的服务器地址:8012/onlinepreview?url={base64编码的文件url}
比如你的文件地址是 https://oss.yourdomain.com/files/contract.docx,做 base64 编码后:
ahr0chm6ly9vc3muew91cmrvbwfpbi5jb20vzmlszxmvy29udhjhy3quzg9jea==
最终预览链接:
http://preview.yourdomain.com/onlinepreview?url=ahr0chm6ly9vc3muew91cmrvbwfpbi5jb20vzmlszxmvy29udhjhy3quzg9jea==
16.2 前端调用示例
// 假设你有一个文件的下载链接
const fileurl = 'https://oss.yourdomain.com/files/contract.docx';
// base64 编码
const encodedurl = btoa(fileurl);
// 拼接预览地址
const previewurl = `http://preview.yourdomain.com/onlinepreview?url=${encodeuricomponent(encodedurl)}`;
// 打开预览
window.open(previewurl);
16.3 java 后端生成预览链接
import java.util.base64;
import java.net.urlencoder;
public class kkfileviewutil {
private static final string kk_base_url = "http://preview.yourdomain.com";
public static string getpreviewurl(string fileurl) {
string encoded = base64.getencoder().encodetostring(fileurl.getbytes());
return kk_base_url + "/onlinepreview?url=" + urlencoder.encode(encoded, "utf-8");
}
}
十七、监控与告警建议
生产环境跑起来之后,不能就不管了。建议至少做以下几件事:
17.1 容器健康检查
前面 docker-compose.yml 里已经配了 healthcheck,docker 会自动检测容器健康状态。你也可以用脚本定期检测:
#!/bin/bash
status=$(docker inspect --format='{{.state.health.status}}' kkfileview 2>/dev/null)
if [ "$status" != "healthy" ]; then
echo "[$(date)] kkfileview 状态异常: $status" >> /data/kkfileview/logs/alert.log
docker restart kkfileview
fi
17.2 磁盘监控
# 检查 /data 分区使用率
usage=$(df -h /data | awk 'nr==2 {print $5}' | sed 's/%//')
if [ "$usage" -gt 85 ]; then
echo "[$(date)] 磁盘使用率 ${usage}%,请及时清理缓存" >> /data/kkfileview/logs/alert.log
fi
17.3 日志轮转
docker 的 json-file 日志驱动前面已经配了大小限制(100mb × 3 个文件),一般不会撑爆磁盘。但应用日志如果也写文件,建议用 logrotate 管理。
十八、完整的一键部署脚本
最后,把整个流程串起来,写一个可以直接执行的脚本。你把它保存为 deploy_kkfileview.sh,给执行权限,一条命令搞定:
#!/bin/bash
set -e
echo "=========================================="
echo " kkfileview docker 一键部署脚本"
echo "=========================================="
# ---- 1. 安装 docker ----
if ! command -v docker &> /dev/null; then
echo "[1/7] 安装 docker..."
curl -fssl https://get.docker.com | sh
systemctl start docker
systemctl enable docker
usermod -ag docker $user
echo "docker 安装完成。注意:需要重新登录终端才能免 sudo 使用 docker。"
else
echo "[1/7] docker 已安装,跳过。"
fi
# ---- 2. 创建目录结构 ----
echo "[2/7] 创建目录结构..."
mkdir -p /data/kkfileview/{config,file,logs,fonts}
# ---- 3. 下载字体包 ----
echo "[3/7] 下载中文字体包..."
if [ ! -f /data/kkfileview/fonts/simsun.ttc ]; then
wget -q http://kkfileview.keking.cn/fonts.zip -o /tmp/fonts.zip
unzip -o /tmp/fonts.zip -d /data/kkfileview/fonts/
rm -f /tmp/fonts.zip
echo "字体下载完成。"
else
echo "字体已存在,跳过。"
fi
# ---- 4. 拉取镜像 ----
echo "[4/7] 拉取 kkfileview 镜像..."
docker pull keking/kkfileview:4.1.0
# ---- 5. 提取默认配置 ----
echo "[5/7] 提取默认配置文件..."
if [ ! -f /data/kkfileview/config/application.properties ]; then
docker run -d --name kkfileview-temp keking/kkfileview:4.1.0
sleep 10
docker cp kkfileview-temp:/opt/kkfileview-4.1.0/config/application.properties \
/data/kkfileview/config/application.properties
docker stop kkfileview-temp && docker rm kkfileview-temp
echo "配置文件已提取到 /data/kkfileview/config/"
else
echo "配置文件已存在,跳过。"
fi
# ---- 6. 启动容器 ----
echo "[6/7] 启动 kkfileview 容器..."
docker run -d \
--name kkfileview \
-p 8012:8012 \
-v /data/kkfileview/config/application.properties:/opt/kkfileview-4.1.0/config/application.properties \
-v /data/kkfileview/file:/opt/kkfileview-4.1.0/file \
-v /data/kkfileview/logs:/opt/kkfileview-4.1.0/log \
-v /data/kkfileview/fonts:/usr/share/fonts/chinese \
-e kk_jvm_options="-xms1g -xmx2g -xx:maxdirectmemorysize=1g" \
--memory=4g \
--restart=always \
keking/kkfileview:4.1.0
# ---- 7. 刷新字体缓存 ----
echo "[7/7] 刷新容器内字体缓存..."
sleep 15
docker exec kkfileview fc-cache -fv > /dev/null 2>&1 || true
docker restart kkfileview
echo ""
echo "=========================================="
echo " 部署完成!"
echo " 访问地址: http://$(hostname -i | awk '{print $1}'):8012"
echo " 配置文件: /data/kkfileview/config/application.properties"
echo " 缓存目录: /data/kkfileview/file"
echo " 日志目录: /data/kkfileview/logs"
echo "=========================================="
使用方式:
chmod +x deploy_kkfileview.sh sudo ./deploy_kkfileview.sh
十九、最后的几点经验
写到这里,技术层面的东西基本都覆盖了。最后分享几个我在实际项目中总结出来的经验,都是踩坑之后才意识到的:
第一,别在生产环境用 latest 标签。 一定要锁定具体版本号。kkfileview 的版本之间偶尔会有不兼容的变更,latest 指向哪个版本你控制不了,哪天自动拉了个新版本下来,配置路径变了,服务就挂了。
第二,字体问题要在部署阶段就解决好,不要等到上线了用户反馈"文件乱码"再去补。 把字体包直接打进自定义镜像里,一劳永逸。
第三,缓存目录一定要挂载到宿主机。 如果不挂载,容器一删缓存全没了,所有文件都要重新转换,大文件转换一次可能就是几十秒,用户体验会很差。
第四,做好容量规划。 我见过一个客户的缓存目录半年涨了 80gb,最后磁盘满了整个服务挂掉。定期清理 + 磁盘告警,这两个动作不能省。
第五,如果你的文件存储用的是 oss(阿里云 oss、腾讯 cos、minio 等),确保文件下载链接有过期时间或者鉴权机制。 kkfileview 是通过 url 去下载文件的,如果你的文件链接是永久公开且无需鉴权的,存在被爬取的风险。
提示:官方文档更新频率不算高,部分配置项在新版本中可能有调整。遇到文档与实际表现不一致时,优先以 github 仓库的 readme 和 issues 区为准,那里通常有最新的解决方案和社区反馈。
以上就是linux服务器从零部署kkfileview的完全指南的详细内容,更多关于linux部署kkfileview的资料请关注代码网其它相关文章!
发表评论