宝塔部署node程序node-canvas模块安装报错解决

目的:node express上使用canvas进行图像处理并返回的接口,部署宝塔使用

环境&版本:

​"canvas": "^2.9.3",
CentOS 7.9
宝塔Linux面板-qP7W
node v16.16.0
下载的是canvas-v2.9.3-node-v93-linux-glibc-x64.tar.gz

node-canvas git地址GitHub - Automattic/node-canvas: Node canvas is a Cairo backed Canvas implementation for NodeJS.

事情是这样的:

在win调试的canvas库是可以运行的,但是在centos上运行出现canvas.node: invalid ELF header的错误,看依赖文件可知本地调试的库只支持win系统

node_modules/canvas/build/Release/canvas.node: invalid ELF header · Issue #1000 · Automattic/node-canvas · GitHub

按道理讲在linux上npm i会下载对应环境的依赖包,但是该包本身npm完全连接不上,使用cnpm才行,但是问题是宝塔面板上安装cnpm失败,于是只能看别的想法

阅读官方文档发现本身包是支持不同环境编译的,但是也遇到了很多问题这里不细说,参考了以下文章,node-canvas模块安装使用过程中报错的解决方法_星哥如是说的博客-CSDN博客_canvas模块

正文

报错1canvas.node: invalid ELF header

报错是依赖包是win或者别的,在linux上不能用

为了在不同平台上使用canvas,官方文档本身提供不同平台的构建方法但是复杂,这里可以直接使用解析好的包进行替换(最便捷的办法了,别的都一堆问题)

下载如下的canvas-v2.9.3-node-v93-linux-glibc-x64.tar.gz

全版本在里面找qq​​​​​​​Releases · Automattic/node-canvas · GitHub

先cnpm在本地安装依赖,找到对应版本的linux包替换canvas依赖中node_modules\canvas\build\Release文件

 

ps:按道理讲这里版本和库的依赖环境对了就没有问题了,以下是我遇到的问题和解决办法而且不知其所以然,出现的问题仅供参考

此时的依赖包是没问题的,上传服务器发现还是有如下报错

报错2/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /home/username/server/node_modules/canvas/build/Release/canvas.node)

git上问题讨论为https://github.com/Automattic/node-canvas/issues/1796

尝试使用他的方法

 将libstdc++.so.6复制到服务器的lib64文件中覆盖

 

但是还有新的报错

报错3“/lib64/libc.so.6: version `GLIBC_2.18‘ not found (required by /lib64/libstdc++.so.6)

使用下面文章方法解决(这个运行时间挺长的)

解决 "/lib64/libc.so.6: version `GLIBC_2.18' not found (required by /lib64/libstdc++.so.6)"_Jabony的博客-CSDN博客

此时程序应该终于跑起来了,全文完,啧

但是我运行又出现了pm2的的报错,更改环境变量可以了

宝塔php加入环境变量,宝塔面板如何配置 node.js 环境变量_weixin_39894914的博客-CSDN博客

ps1但是不知道为什么版本管理器挂了 ……

ps2版本和node版本不符会出现以下程序启动报错,所以这里选择的都是最新的对应的模块版本

  NODE_MODULE_VERSION 83对应nodejs版本为Node.js 14.X

  NODE_MODULE_VERSION 72对应nodejs版本为Node.js 12.X