在centos7(7.9)下部署NodeJs18版本的过程

安装nodejs18.16.0版本后,nodejs和npm都报错,因为centos7不支持。

需要升级系统的make、GCC、GLIBC的版本。

1. 升级make

查看升级前的版本:可以发现是GNU Make 3.82
1
# make -v
下载4.2版本,不能使用更高的版本。
1
2
3
# yum -y install wget
mkdir -p /root/mydownload && cd /root/mydownload
wget http://ftp.gnu.org/pub/gnu/make/make-4.2.tar.gz
编译安装make4.2
1
2
3
4
5
6
7
8
9
10
11
cp /root/mydownload/make-r.2.tar.gz /usr/src
cd /usr/src
tar -xf make-4.2.tar.gz
cd make-4.2
./configure
make -j4
make install
cd /usr/bin
mv make make3.8
cp /usr/local/bin/make /usr/bin

已经升级为4.2版本
1
make -v

2. 升级GCC

 查看当前版本:4.8.5
 
1
gcc --version
下载8.1.0版本
1
2
3
cd /root/mydownload
wget http://www.netgull.com/gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.gz

安装依赖
1
yum -y install bzip2
编译安装GCC8.1.0版本
1
2
3
4
5
6
7
8
9
10
11
12
13
cp /root/mydownload/gcc-8.1.0.tar.gz /usr/src
cd /usr/src
tar -xf gcc-8.1.0.tar.gz
cd gcc-8.1.0
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4
make install
cd /usr/bin/
mv gcc gcc4.8.5
cp /usr/local/bin/gcc /usr/bin
查看升级后GCC版本
1
[root@DockersHK bin]# gcc --version
1
2
3
4
gcc (GCC) 8.1.0
Copyright © 2018 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
查找最新动态库:
1
[root@DockersHK bin]# find / -name "libstdc++.so*"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/var/lib/docker/overlay2/1931879334e2d9b88d5ef702e2c6a054567c0c594027b3494b88e1b7c4aebb2e/diff/usr/lib/libstdc++.so.6.0.28
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/local/lib64/libstdc++.so.6.0.25
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.25-gdb.py
/usr/src/gcc-8.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/usr/src/gcc-8.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/src/gcc-8.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/usr/src/gcc-8.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/usr/src/gcc-8.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/src/gcc-8.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/usr/src/gcc-8.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/usr/src/gcc-8.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/src/gcc-8.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/32/libstdc++.so
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.so

把找到的最新的动态库libstdc++.so.6.0.25复制至/usr/lib64目录下:

1
[root@DockersHK bin]# cp /usr/src/gcc-8.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25 /usr/lib64

查看默认动态库的版本:

1
2
3
[root@DockersHK bin]# cd /usr/lib64/
[root@DockersHK lib64]# ls -ln libstdc++.so.6
lrwxrwxrwx. 1 0 0 19 1227 11:39 libstdc++.so.6 -> libstdc++.so.6.0.19

将默认动态库的软连接指向最新的动态库:

1
2
3
[root@DockersHK lib64]# mv libstdc++.so.6{,.bak}
[root@DockersHK lib64]# ln -sv libstdc++.so.6.0.25 libstdc++.so.6
"libstdc++.so.6" -> "libstdc++.so.6.0.25"

3. 升级GLIBC

查看升级前版本

1
2
3
4
5
6
[root@DockersHK lib64]# ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
由 Roland McGrath 和 Ulrich Drepper 编写。

下载2.30版本

1
2
[root@DockersHK ~]# cd /root/mydownload
[root@DockersHK ~]# wget http://ftp.gnu.org/pub/gnu/glibc/glibc-2.30.tar.xz

GLIBC从2.29版本开始需要Python3.4以上版本支持

1
2
3
4
[root@DockersHK mydownload]# python -V
Python 2.7.5
[root@DockersHK mydownload]# wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz

安装依赖软件包

1
[root@DockersHK mydownload]# yum -y install zlib-devel openssl-devel ncurses-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel

编译安装3.8.0版本

1
2
3
4
5
6
7
8
9
[root@DockersHK mydownload]# tar -xf Python-3.8.0.tar.xz 
[root@DockersHK mydownload]# cd Python-3.8.0
[root@DockersHK Python-3.8.0]# ./configure --prefix=/usr/local/python3.8.0

[root@DockersHK Python-3.8.0]# make -j4 && make install

[root@DockersHK Python-3.8.0]# mv /usr/bin/python /usr/bin/python2.7.5
[root@DockersHK Python-3.8.0]# ln -sv /usr/local/python3.8.0/bin/python3 /usr/bin/python
[root@DockersHK Python-3.8.0]# ln -sv /usr/local/python3.8.0/bin/pip3 /usr/bin/pip

配置环境变量:

1
2
3
4
5
[root@DockersHK Python-3.8.0]# vim /etc/profile.d/python3.8.0.sh
输入 export PATH=/usr/local/python3.8.0/bin:$PATH
[root@DockersHK Python-3.8.0]# . /etc/profile.d/python3.8.0.sh
查看升级后的版本:
python -V
1
2
3
4
vim /usr/bin/yum
修改第一行的python为python2.7.5
vim /usr/libexec/urlgrabber-ext-down
同理

安装GLIBC 2.30的依赖包

1
yum -y install bison texinfo
1
2
3
4
5
6
7
8
[root@DockersHK Python-3.8.0]# cd /root/mydownload/
[root@DockersHK mydownload]# tar -xf glibc-2.30.tar.xz
[root@DockersHK mydownload]# cd glibc-2.30
[root@DockersHK glibc-2.30]# mkdir build
[root@DockersHK glibc-2.30]# cd build/
[root@DockersHK build]# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
[root@DockersHK build]# make -j4 && make install

最后提示了两个错误项,但不会影响GLIBC的版本升级。

1
2
3
4
5
6
7
8
You should restart this script from your build directory after you've
fixed all problems!
Btw. the script doesn't work if you're installing GNU libc not as your
primary library!
make[1]: *** [Makefile:111: install] Error 1
make[1]: Leaving directory '/root/mydownload/glibc-2.30'
make: *** [Makefile:12:install] 错误 2
[root@DockersHK build]#

可以发现GLIBC已经升级为2.30版本

1
2
3
4
5
6
[root@DockersHK build]# ldd --version
ldd (GNU libc) 2.30
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

测试阶段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@DockersHK build]# strings /lib64/libc.so.6 | grep ^GLIBC_2.25 | uniq
GLIBC_2.25
[root@DockersHK build]# strings /lib64/libc.so.6 | grep ^GLIBC_2.28 | uniq
GLIBC_2.28
[root@DockersHK build]# strings /lib64/libc.so.6 | grep ^GLIBC_2.27 | uniq
GLIBC_2.27
[root@DockersHK build]# strings /lib64/libstdc++.so.6 | grep ^CXXABI_1.3.9 | uniq
CXXABI_1.3.9
[root@DockersHK build]# strings /lib64/libstdc++.so.6 | grep ^GLIBCXX_3.4.20 | uniq
GLIBCXX_3.4.20
[root@DockersHK build]# strings /lib64/libstdc++.so.6 | grep ^GLIBCXX_3.4.21 | uniq
GLIBCXX_3.4.21
[root@DockersHK build]# node -v
v18.16.0
[root@DockersHK build]# npm -v
9.5.1

可选扩展配置

修改npm源为淘宝

1
2
3
4
5
查看当前源
# npm config get registry
更换为淘宝源
# npm config set registry https://registry.npmmirror.com

配置cnpm包管理工具

1
2
3
4
5
# npm install -g cnpm
# npm install -g [email protected]
查看cnpm的版本
# cnpm -v


在centos7(7.9)下部署NodeJs18版本的过程
http://anximin.github.io/2023/12/29/Linux_centos7NodeJs18/
作者
Sylar
发布于
2023年12月29日
许可协议