离线部署PhantomJS踩坑记

32 阅读3分钟

离线服务器中部署java项目,项目中有关联启动PhantomJS,然后一直报错启动失败,之前默认以为已经启动了,直到今天去执行导出Word相关功能才发现此项目完全没启动。

首先还是解释一下PhantomJS是什么

# PhantomJS是一个基于WebKit引擎的JavaScript API,可以模拟浏览器行为而不需要图形界面。
我这边主要用来做图片的导出,将网页中的echarts图渲染成对应的图片

问题现象

  1. 首先排查还是查看对应端口,使用的命令是netstat -a | grep 1234

  2. 没有启动后,便单独去启动 ./PhantomJS , 发现报错:

    libfontconfig.so.1libpng15.so.15缺失

$ ./phantomjs --version
error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory

随后安装fontconfig后,又出现新错误:

error while loading shared libraries: libpng15.so.15: cannot open shared object file: No such file or directory

原因分析

依赖链断裂

PhantomJS依赖两个核心库:

  • libfontconfig.so.1 → 字体配置与渲染

  • libpng15.so.15 → PNG图像处理

离线环境无法通过yum自动解决依赖,必须手动获取RPM包。

解决方案

在Windows环境准备RPM包

访问 CentOS 7.9官方归档仓库,下载4个核心包:

表格复制

包名下载链接作用
fontconfigfontconfig-2.13.0-4.3.el7.x86_64.rpm字体配置核心库
libpng15libpng15-1.5.13-8.el7.x86_64.rpmPNG图像处理
freetypefreetype-2.8-14.el7.x86_64.rpm字体渲染引擎
expatexpat-2.1.0-15.el7_9.x86_64.rpmXML解析库

将下载好的核心包进行打包

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

# 将所有rpm放入phantomjs-deps文件夹
tar czvf phantomjs-deps-centos7.tar.gz phantomjs-deps/

在离线服务器进行安装

先清除残留的不兼容库
# 删除之前遗留数据
sudo rm -f /usr/lib64/libfontconfig.so.1*
sudo rm -f /usr/lib64/libpng15.so.15*

# 解压U盘中的部署包
mkdir -p /tmp/phantomjs-install
cd /tmp/phantomjs-install
tar xzf /mnt/usb/phantomjs-deps-centos7.tar.gz

# 按顺序手动安装(--nodeps跳过依赖检查)
sudo rpm -ivh --nodeps --force expat-*.rpm
sudo rpm -ivh --nodeps --force freetype-*.rpm
sudo rpm -ivh --nodeps --force libpng15-*.rpm
sudo rpm -ivh --nodeps --force fontconfig-*.rpm

# 更新动态链接库缓存(关键!)
sudo ldconfig

# 验证安装
ls -l /usr/lib64/libfontconfig.so.1  # → libfontconfig.so.1.10.1
ls -l /usr/lib64/libpng15.so.15      # → libpng15.so.15.13.0

验证PhantomJS

# 1. 检查依赖完整性
ldd /你的路径/phantomjs/bin/phantomjs | grep -E "fontconfig|png15"
# 输出应包含两行,且无"not found"

# 2. 启动测试
./phantomjs --version
# 输出: 2.1.1

# 3. 渲染测试
cat > /tmp/test.js <<'EOF'
var page = require('webpage').create();
page.content = '<h1>中文渲染测试</h1>';
page.render('/tmp/test.png');
phantom.exit();
EOF
./phantomjs /tmp/test.js
ls -lh /tmp/test.png  # 文件存在即成功

总结

补齐缺失库需要注意:

  1. 版本匹配原则:源系统和目标系统的glibc版本必须一致ldd --version

  2. 架构一致性:必须同为x86_64aarch64uname -m

  3. 纯64位环境:避免混装i686包导致冲突

教训:

  • ldconfig:安装后必须执行,否则系统找不到新库

  • 手动安装顺序:先装基础依赖(expat),再装上层库(freetype → libpng15 → fontconfig)

  • 自动化脚本:提前写好download.shinstall.sh,避免现场拼写错误

通过此次排查,一个是问题定位能力,其次是解决问题的逻辑严谨性都得到了深刻体会。