之前的文章中介绍了「“木偶”浏览器简简史」,文中介绍了 Google 的 Puppetter,这一篇介绍下如何在 Centos7 环境下部署 Puppeteer 服务环境。

上一篇文章的示例代码的环境是我本地的 MacOS,但实际在服务器上运行时,会出现问题,这也是我写这篇文章的原因。

MacOS 环境

安装

通过 NPM 安装:npm install puppetter
Puppeteer 包安装完成后会执行 node install.js,将最新版本的 Chromium 下载到 node_module 目录的 puppetter 目录下。

安装完成就可以直接调用了。

CentOS 7

CentOS 下如果使用上述的方式安装,安装时没问题,但真实调用时,会出现 Chromium 缺少依赖项的报错,通过安装以下依赖可以解决。

1
2
#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

解决了依赖问题,我们继续,调用截图,发现中文乱码,机器上没有对应的中文字体,需要安装中文字体,可以通过安装以下字体解决。

1
2
#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y

不过这些字体显示仍然非常“粗糙”,不过还好能正常显示。

问题 & 解决

通过上面的层层努力,我们终于艰难地把项目部署到了 CentOS 上,现在整理下过程中的问题。

问题一:Chromium 包太大 & Chromium 依赖

不论是 MacOS 环境还是 CentOS 下,Chromium 69 的包的 Size 大概 100M左右,安装过程可能因为网络问题失败,并且每次重新构建都需要重复这个过程,这种项目部署方式是非常糟糕,并且还需要在环境中解决依赖问题。

当然,可以选择使用增加 ignore-scripts 参数忽略安装时的脚本执行,安装结束后手动安装,

npm install --ignore-scripts

但这可能会影响到同一个项目中其他依赖的安装,耦合不是我们希望看到的,不过上一篇提到,Puppeteer 从 1.7 版本后,单独出了 puppetter-core, 选择直接安装 puppetter-core 将不会安装浏览器。

不过两种方案都需要手动安装 Chromium,这反而让过程变得更复杂,我们的原则是能使用 auto 模式绝不用 manual 模式。

解决一:系统安装 Chrome & 选用puppeteer-core

先说结论,选择 系统安装 Chrome(version >= 68) + puppetter-core 方案

解决手动安装以及避免依赖问题,选择将 Chrome 安装在系统全局中,通过 rpm 安装方式如下:

yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

调用时,传入 Chrome 安装的可执行路径即可,例如 CentOS,
const browser = await puppeteer.launch({executablePath: '/usr/bin/google-chrome'})

解决二:字体

字体推荐在系统中安装微软雅黑等字体。