随着越来越多的工具不再支持 Nodejs 16, 是时候将服务器的 Nodejs 版本升级到18了, 服务器本来就安装了nvm, 所以升级也很简单, 直接

nvm install v18.18.2
nvm use 18
1
2

就行了, 可是已运行node -v, 漂亮, 直接报错

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

根据Nodejs官方的通知, Nodejs 18 至少需要glibc v2.28, 换其他系统似乎太麻烦了, 一大堆软件需要重新安装, 想想都怕, 所以还是考虑升级glibc

准备工作

升级 GCC

yum install -y centos-release-scl
yum install -y devtoolset-8-gcc*
scl enable devtoolset-8 bash
gcc --version
# 也可以加上软连接, 省事
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
gcc --version
1
2
3
4
5
6
7
8
9
10

升级 make 到 4.3 版本

# 下载
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz
# 解压缩
tar -xzvf make-4.3.tar.gz && cd make-4.3/
# 编译/安装
./configure  --prefix=/usr/local/make
make && make install
# 备份
cd /usr/bin/ && mv make make.bak
# 重新建立软连接
ln -sv /usr/local/make/bin/make /usr/bin/make
1
2
3
4
5
6
7
8
9
10
11

安装 bison

yum install bison
1

编译安装 glibc-2.28

cd ~
mkdir update-nodejs18
cd update-nodejs18/
# 下载包
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz --no-check-certificate
# 解压缩
tar -xzvf glibc-2.28.tar.gz
cd glibc-2.28
mkdir build && cd build
# 编译/安装
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make j4
make install
1
2
3
4
5
6
7
8
9
10
11
12
13

如果编译时报undefined reference to '_nsl_default_nss@GLIBC_PRIVATE'错误,
可以在../configure命令最后没添加 --enable-obsolete-nsl(注意空格)

如果编译时报nss_test2错误, 可以修改scripts/test-installation.pl 文件的第 128 行处,增加一行 && $name ne "nss_test2"

126 if ($name ne "nss_ldap" && $name ne "db1"
127 && $name ne "thread_db"
128 && $name ne "nss_test2"
129 && $name ne "nss_test1" && $name ne "libgcc_s") {
130 $link_libs .= " -l$name";
131 $versions{$name} = $version;
132 }
1
2
3
4
5
6
7

查看glibc支持的版本, 如果包含GLIBC_2.28, 则安装成功

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

测试下 Nodejs 是否正常了

node -v
1

如果正常出现版本, 则已经安装完成, 如果出现以下错误:

node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
1
2
3

则需继续往下看, 还得升级下libstdc++.so.6文件

cd /use/lib64
# 下载文件
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26
# 建立软连接
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6
1
2
3
4
5

再次运行node -v, 发现nodejs版本出来了, 说明大功告成

通过二进制包安装 NodeJS 18

如果没有使用nvm, 也可以直接通过下载nodejs包来安装

打开 https://registry.npmmirror.com/binary.html?path=node/
选择自己想要的版本, 进入对应目录, 复制node-v**.**.**-linux-x64.tar.gz的下载链接

cd ~
wget https://registry.npmmirror.com/-/binary/node/v18.18.2/node-v18.18.2-linux-x64.tar.gz
tar -xzvf node-v**.**.**-linux-x64.tar.gz
mv node-v**.**.**-linux-x64 node
1
2
3
4

node, npm, npx建立软链接

sudo ln -s /root/node/bin/node /usr/bin/node
sudo ln -s /root/node/bin/node /usr/local/bin/node
sudo ln -s /root/node/bin/npm /usr/bin/npm
sudo ln -s /root/node/bin/npm /usr/local/bin/npm
sudo ln -s /root/node/bin/npx /usr/bin/npx
sudo ln -s /root/node/bin/npx /usr/local/bin/npx
1
2
3
4
5
6

测试版本是否正常

node -v // v18.18.2
npm -v // 9.8.1
npx -v // 9.8.1
1
2
3

第二种方法?

如果实在怕出现问题, 不敢更新glibc, 那么可以尝试使用nodejs的非官方构建版本

打开 https://registry.npmmirror.com/binary.html?path=node-unofficial-builds/ , 选择一个版本, 然后按上面通过二进制包安装 NodeJS 18的步骤安装即可