主题
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 的安装过程
- npm 下载在仓库中的 canvas 包
bash
$ npm i canvas -S
- 随后会自动执行 canvas 的 package.json 中的 install 命令 (node-pre-gyp install --fallback-to-build)
- node-pre-gyp 会 下载 canvas 已编译好的 macOS、Linux 和 Windows 的二进制文件,如果预构建的二进制文件不存在或不可用,则回退到从源代码构建
- 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*"
- node-canvas有对应issues node-canvas 库的 issues
解决(升级依赖的 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*"
- 高版本内一般都包含了低版本