Skip to content

nodejs 使用 node-canvas 包时遇到的环境问题

canvas-node

node-canvas是一个在 node 环境下使用类似浏览器的 canvas 画布的库, 可用以生成图片,pdf 等, 功能强大,但是这个库在使用时候依赖一些环境, 因为内部有 C++, C, Python, Typescript, Javascript 等多种语言, 其通过 npm 安装的部分包内包含二进制文件,需要环境的支持

By default, binaries for macOS, Linux and Windows will be downloaded. If you want to build from source, use npm install --build-from-source and see the Compiling section below.

安装这个包有两种方式

  • 一种是通过 npm 安装,也就是这篇文章才用的方式,
  • 另一种是通过构建源代码的方式进行安装, 比较繁琐

TIP

  • 我的环境版本
  • node V14.20.0
  • npm 6.14.17
  • CentOS Linux release 7.6.1810 (Core)

问题 1、npm 安装 canvas-node 时候失败

canvas 的安装过程

  1. npm 下载在仓库中的 canvas 包
bash
$ npm i canvas -S
  1. 随后会自动执行 canvas 的 package.json 中的 install 命令 (node-pre-gyp install --fallback-to-build)
  2. node-pre-gyp 会 下载 canvas 已编译好的 macOS、Linux 和 Windows 的二进制文件,如果预构建的二进制文件不存在或不可用,则回退到从源代码构建
  3. node-gyp 编译为当前平台可用的 node 模块

在执行到第 3、4 步的时候,由于 canvas 的二进制文件托管在 github.com/Automattic/… ,下载服务由 objects.githubusercontent.com 提供,如果你的网络运营商给力,你将会大概率成功,否则你将会得到 read ECONNRESET 的提示。 而使用源码构建非常繁琐,对系统 os 存在诸多限制,开发环境和运行环境的系统 os 不一致也会大大增加我们的工作量且导致一些不可预料且难以捉摸的问题。

解决办法

用国内镜像加速的方式加快下载速度

bash
# 零时
npm install canvas --canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas

# 永久
npm config set canvas_binary_host_mirror https://registry.npmmirror.com/-/binary/canvas

# 或者在 .npmrc 内加上一行
canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas

问题 2、centos7 环境'CXXABI_1.3.9' not found

部署项目时候报错:

bash
error: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /home/service/app/yourNodeProduction/node_modules/canvas/build/Release/canvas.node)`

出现上面的问题,主要原因是因为 gcc 动态库版本过老。如果没有 CXXABI_1.3.9,需要进行更新对应的 libstdc++.so.6

bash
# 查询是否有对应的GLIBC 或者 GLIBC
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
strings /usr/lib64/libstdc++.so.6|grep CXXABI

解决方法一:更新 libstdc++.so.6.0.26

bash
# 更新lib libstdc++.so.6.0.26
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26


# 替换系统中的/usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64/
cd /usr/lib64/
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6

解决方法二:查找本机上新的 so 库

或者如果电脑里面有新的 so 库的话 就不用下载 执行上面的内容进行软连接即可

查找命令

bash
# 查询本机的so库
find / -name "libstdc++.so.*"

找到后,执行第一步内替换系统中的/usr/lib64步骤,若找不到就没戏

问题 3、Error: /lib64/libc.so.6: version 'GLIBC_2.18' not found

在问题 2 解决完成后,可能还会存在找不到 GLIBC_2的问题, 报错信息如下:

bash
error: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /home/service/app/yourNodeProduction/node_modules/canvas/build/Release/librsvg-2.so.2)`

原因就是,libc.so.6 里面缺乏 GLIBC_2.18 造成的。

解决方法

可以先用 strings 命令查看下系统中的 GLIBC 版本:

bash
strings /lib64/libc.so.6 | grep GLIBC

然后,随便找一个目录,依次输入以下命令即可

bash
wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxf glibc-2.18.tar.gz
cd glibc-2.18/
mkdir build
cd build/
../configure --prefix=/usr
make -j2
make install

在这里, 执行../configure --prefix=/usr步骤的时候, 可能会遇到如下报错:

bash
sh-4.2# ../configure --prefix=/usr
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/glibc-2.18/build':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details

出现这个错误的原因是你的系统中没有安装 C 编译器(如 gcc 或 clang)。configure 脚本在尝试编译 glibc 之前,会检查是否有一个可用的 C 编译器。如果没有找到,就会报错并停止执行。

要解决这个问题,你需要安装一个 C 编译器。在大多数 Linux 发行版中,你可以通过包管理器来安装 gcc。以下是一些常见 Linux 发行版的安装命令:

bash
# 对于 Debian/Ubuntu 及其衍生版:
# build-essential 包包含了编译软件所需的多个工具,包括 gcc 和 make。
sudo apt-get update
sudo apt-get install build-essential


# 对于 CentOS/RHEL 及其衍生版:
# 这个命令会安装包括 gcc 在内的开发工具。
sudo yum groupinstall "Development Tools"

# 对于 Fedora:
# Fedora 使用 dnf 作为包管理器,与 yum 类似。
sudo dnf groupinstall "Development Tools"

安装完成以后, 重新执行 ../configure --prefix=/usr及其后续步骤即可

验证 glibc_2.18 是否安装成功

bash
strings /lib64/libc.so.6 | grep GLIBC

问题 4、version ZLIB_1.2.9 not found

一般报错信息为

sh
/lib64/libz.so.1: version `ZLIB_1.2.9' not found (required by ./rmblastn)

首先检查现有版本

sh
strings /usr/lib64/libz.so.1 | grep "ZLIB_1*"

解决(升级依赖的 zlib 版本)

上述报错信息是在/lib64下面,一般/lib64都指向/usr/lib64,可以到/ls -l查看对应关系

到 zlib 官网https://www.zlib.net/ 右键复制地址

然后执行下面的 shell 脚本(针对 centos 系统)

sh
cd /
wget  https://www.zlib.net/zlib-1.3.1.tar.gz
tar -xvf zlib-1.3.1.tar.gz
cd zlib-1.3.1
./configure --prefix=/usr/lib64
make
make install
  • 其中./configure --prefix=/usr/lib64 这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如上述代码的意思是将该软件安装在 /usr/lib64 下面,因为找不到的地方就是在 /lib64下面找不到
  • 再次检查版本strings /usr/lib64/libz.so.1 | grep "ZLIB_1*"
  • 高版本内一般都包含了低版本