写在前面的话
博客和生活一样,都是需要用心经营的,我把博客丢掉两年多,总是对自己讲,实在是太忙没时间写,可真的吗?不是这样,时间还是能够挤出来的,懒惰才是根本原因,人一旦变懒,会在方方面面表现出,会慢慢变成一种习惯。2019年坚持锻炼一年,效果还算不错,然后疫情来了,emmm....是时候拿出真正的技术啦!
为什么会写这篇文章,实在是在实践过程中躺了许多坑,帮助那些还在迷茫途中的小朋友指引下明灯,希望能够帮到正在看文章的你。先把结论抛给大家,CentOS 6不支持安装puppeteer。
=================================== 可爱的分割线 ===================================
本机环境测试,macOS Catalina + node v12.16.1 + npm 6.13.4 安装puppeteer构建可用的导出pdf服务,没有问题,完全可用【在导出过程中发现pdf窗口viewport不对情况,可通过设置puppeteer.launch({defaultViewport: null})解决】
我们的重点是什么?构建导出pdf服务,服务器环境CentOS 6.3 Final版本,不支持连接外网。所以初步方案是通过编写shell脚本部署,编写脚本前,需要校验环境是否可行,是否能够支持正常的导出pdf文件,所以我们选择先手动尝试安装。
我们漫长虐心的实践开始了。
1.先和厂内同学沟通,了解到CentOS 6不支持安装puppeteer,具体卡在libxxxx.so包的安装上,出于对事情的好奇,决定还是践行一下。
2.下载Linux系统所需要的文件包,地址从哪里来?可以看下本机mac安装的node_modules文件中puppeteer代码。
a.找到xxxx/node_modules/puppeteer/lib/BrowserFetcher.js文件 (当前使用[email protected]版本)
b.linux平台下载地址
%s/chromium-browser-snapshots/Linux_x64/%d/%s.zip
其中
第一个%s替换为DEFAULT_DOWNLOAD_HOST的值
%d替换为版本号(node_modules/puppeteer-core/packages.json中查找)
最后的%s从函数archiveName中获取,为'chrome-linux'
整体最后的url为 https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/722234/chrome-linux.zip
3.把chrome-linux.zip文件传输到服务器上(自行处理,我使用的是sz/rz命令)
4.unzip解压缩,手动存储到
/node_modules/puppeteer/.local-chromium/linux-722234/
.local-chromium/linux-722234/ 这两层目录为手动创建,722234是版本号,步骤2中的%d值
不同平台对应的目录名称不同,比如mac 就是mac-722234
5.写一个简单的测试脚本,如下,命名为test.js
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.baidu.com');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
6.node test,很不顺利,会出现如下错误
xxxxPromiseRejectionWarning: Error: Failed to launch the browser process!
xxxx/node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such xxxx
缺少Chrome程序正常运行的共享库,通过命令查找源
repoquery --nvr --whatprovides libXss.so.1
结果为:
libXScrnSaver-1.2.0-1.el6
此时,通过yum install libXScrnSaver* 安装解决。
然后,再次node test,发现还有错误,这样下去会比较烦躁,我们应该从根本上看看Chrome程序运行到底还缺少哪些文件
7.执行如下命令,首先进到Chrome程序目录
> cd node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux
> ldd chrome | grep not
得到类似于如下内容的结果:
libatk-bridge-2.0.so.0 => not found
libatspi.so.0 => not found
libgtk-3.so.0 => not found
libgdk-3.so.0 => not found
重点来了,查找资料发现libatk-bridge-2.0.so.0在CentOS6.x环境不支持,必须升级到CentOS 7.x版本
原文地址
关键内容如图:
来自官方声明,翻译为人话就是,升级到CentOS7或者使用FF ESR
8.怎么办?不使用FF,可以升级CentOS到7.5,那就好办了
解决方案:使用docker镜像node 10.x + CentOS 7.5 环境,然后手动安装chrome-linux,还是需要解决xxxx.so的各种问题,校验。
成功导出example.png
=================================== 可爱的分割线 ===================================
写在末尾
前前后后花费几天时间,包含部署,打镜像,解决问题,安装程序,调试环境,测试脚本,写总结,关键这几天是多余出来的工作量,这是叫人不爽的地方。编写puppeteer脚本本身,遇到viewport尺寸问题,pdf怎么导出部分内容,如何去白边,加层级,这些属于工作本身,可以接受。最终掉坑到环境部署上,有些尴尬。
为什么没提前发现问题呢?
1.对服务器基础设备环境能力过于高估判断;
2.没有考虑过这个问题;
全文结束,感谢您的耐心阅读,有什么问题,留言。