避免glibc版本而报错,CentOS等Linux安装node.js完美方法

概述

对于Node.js v18.x或更高,Node.js官方默认是在Ubuntu 20.04, Debian 10, RHEL 8,CentOS 8等高版操作系统上编译得到的,高版本操作系统的glibc版本≥2.28。所以,下载Node.js后,也需要glibc版本≥2.28才能使用。

而CentOS 7.x等操作系统自带的glibc版本为2.17,使用Node.js官网下载的版本运行会报错:

/lib64/libm.so.6: version `GLIBC_2.27' not found (required by ./node)
/lib64/libc.so.6: version `GLIBC_2.25' not found (required by ./node)
/lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./node)
/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./node)
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./node)
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./node)

linux-vdso.so.1 => (0x00007ffca6bd4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b574ed87000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00002b574ef8b000)
libm.so.6 => /lib64/libm.so.6 (0x00002b574f293000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b574f595000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b574f7ab000)
libc.so.6 => /lib64/libc.so.6 (0x00002b574f9c7000)
/lib64/ld-linux-x86-64.so.2 (0x00002b574eb63000)

报错的原因操作系统的glibc版本低,但Node.js所需的版本高。

因glibc是操作系统的重要依赖库,许多软件都需要使用和依赖glibc。一旦贸然升级glibc为高版本,很可能导致操作系统及相关软件不稳定。所以不能轻易为了安装Node.js而随意升级glibc,尤其是在生产环境中。

常见的尝试办法

对于以上问题,常见的解决办法都不完美。总结如下:

1、在CentOS 7.x等操作系统中,将默认的glibc版本强制升级为≥2.28。但此方法面临两个问题:①过程繁琐,为了编译glibc高版本,还需要升级gcc、make等。②升级完成后,依赖于glibc低版本的其他软件可能运行不稳定,存在发生未知错误风险。此风险生产环境通常无法接受。

2、在CentOS 7.x等操作系统中,不改变整个OS系统的glibc版本,而是仅改变node所依赖的lib。比如:①在某个操作系统用户中(不使用root是避免破坏整个操作系统),下载node所需的依赖;②从官方下载的node可执行文件,通过patchelf工具修改node可执行文件,将其所依赖指向的"ld-linux-x86-64.so.2"、"libm.so.6"、"libc.so.6"等等再启动,具体可搜索网上教程。 此方法过程繁琐,可能来回出错,且属于对可执行文件强行修改,存在风险。

3、在CentOS 7.x等操作系统中,下载Node.js源代码并进行本地编译。源代码编译仍需要①升级gcc、make等为高版本,②编译过程中仍需要依赖glibc 2.28。

注:Node.js不仅需要依赖高版本glibc,还需要高版本的gcc、make及其他库等开发工具。对于这些开发工具既可以单个下载单个安装,也可以采用更快更方便的方式安装。既:

通过Linux的scl计划,三部安装各种开发工具集,具体见:https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/

该网站只介绍了devtoolset-8,实际上还有devtoolset-9、devtoolset-10、devtoolset-11

完美解决办法

以上问题不仅我们遇到,全世界都涉及此问题,因此Node.js官方也有人意识到此问题,在其github中,nodejs下有一个"unofficial-builds"子计划。

"unofficial-builds" 子计划是在官方标准发布的基础上,额外提供适应其他平台的编译发布版,此Node.js编译版虽然官方不承担保证责任,所以命名为:"unofficial-builds"。 但由于是Node.js的子项目,也是挂在nodejs.org网站下的,算是"不担责的官方编译版"。"unofficial-builds"下载网址:

https://unofficial-builds.nodejs.org/download/release/

对于Linux,选择对应平台下载并解压即可直接使用。

此"unofficial-builds" 编译版与官方的标准发布仅仅是编译平台不同,推荐大家下载使用,比较稳定,还避免自己来回折腾。目前用起来非常完美。

相关推荐
垣宇33 分钟前
Vite 和 Webpack 的区别和选择
前端·webpack·node.js
沐千熏43 分钟前
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
linux·mysql·centos
爱吃南瓜的北瓜1 小时前
npm install 卡在“sill idealTree buildDeps“
前端·npm·node.js
翻滚吧键盘1 小时前
npm使用了代理,但是代理软件已经关闭导致创建失败
前端·npm·node.js
浪九天2 小时前
node.js的版本管理
node.js
浪九天4 小时前
node.js的常用指令
node.js
袁庭新6 小时前
CentOS7通过yum无法安装软件问题解决方案
centos·操作系统
浪九天6 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
小纯洁w17 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
熬夜不洗澡19 小时前
Node.js中不支持require和import两种导入模块的混用
node.js