Linux上部署nodejs首先必须确定已经准备好了虚拟机或者Linux系统,使用wget进行安装,不采取yum的形式,因为yum是下载后自动安装,而wget是下载后手动安装
下载部署nodejs
# 如果没有安装wget需要先安装wget
# 可以使用whereis wget查看是否有安装获取直接shiyongwget命令
yum install wget -y
# 安装好进入/usr/local,下载nodejs的二进制文件文件,注意不要下载源码
cd /usr/local
# https://nodejs.org/dist可以查看对应的版本信息
# 下载以现在结尾的node-v18.20.2-linux-x64.tar.xz,不要下载node-v18.20.2-linux-x64.tar.gz
wget https://nodejs.org/dist/latest-v18.x/node-v18.20.2-linux-x64.tar.xz
# 解压
tar -xvf node-v18.20.2-linux-x64.tar.xz
# 解压后的名称太长可以进行重命名,当然也可以不用重命名,根据个人习惯而定
mv node-v18.20.2-linux-x64 /usr/local/nodejs
# 进入nodejs下的bin目录可以看见npm、node等文件
# 输入./node -v 或者./npm -v,正常情况下基本上可以出现node或者npm的版本信息
cd /usr/local/nodejs/bin
./node -v
./npm -v
测试nodejs安装情况
输入./node -v 或者 ./npm -v理想中的结果是可以看到版本信息
但是对于node18或以上的版本是存在问题的,实际上会报错(如果不是centos7并且也可以正常启动,那么就不予理会即可,正常使用就可以了)
原因分析
其实根据打印的信息可以判断处GLIBCheCXXABI和GLIBCXX版本信息匹配不到,gcc动态库版本太老了导致的,即使使用yum update进行更新,libstdc++.so.6也是不会变动的
# 查看当前glibc、cxxabi、glibcxx版本
strings /lib64/libc.so.6 | grep -E "^GLIBC_" | sort -V -r | uniq
strings /lib64/libstdc++.so.6 | grep "CXXABI_"
strings /lib64/libstdc++.so.6 | grep "GLIBCXX_"
并且执行ldd --version,glibc的版本也是2.17
解决方法:
- 升级gcc和glibc版本(如果有特殊需求可以进行原文件的备份)
- 使用其他发行版,如Ubuntu或Fedora,这些发行版中默认已经有适用于nodejs18或以上的gcc和glibc(不推荐,常用的Linux其实基本上基于centos的)
- 使用较低版本的nodejs(较低的LTS版本的),较低版本对于gcc和glibc的支持并不高,安装nodejs即可用,不用进行额外的处理
此处采用升级gcc和glibc的方式解决
解决方案
此处小编极力推荐使用devtoolset-8进行安装
# 安装devtoolset-8
yum install centos-release-scl -y
yum install devtoolset-8 -y
# 启动devtoolset-8,只有启动才能更新gcc和glibc
scl enable devtoolset-8 bash
# 更新gcc和glibc
yum install devtoolset-8-toolchain -y
scl enable devtoolset-8 bash
# 测试更新版本
gcc --version
ldd --version
很明显,gcc更新时成功的,如果glibc更新成功,那么就可以正常看到node的版本了,但是此处更新并没有成功,还是无法获取node的版本,那么继续进行手动处理升级更新
# 下载glibc,注意不要下载太新的版本
yum install bison -y
cd /usr/local
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.28.tar.gz
# 解压glibc
tar -zxvf glibc-2.28.tar.gz
# 编译并安装
cd glibc-2.28
mkdir build
cd build
../configure --prefix=/usr
make -j4 && make install
此时glibc已经更新完毕了,但是还需要继续操作,此时运行node也是不行的
此处还不能运行是因为libstdc++.so.6.0.26没有更新,可以查看对应的usr的libstdc++.so.6
strings /usr/lib64/libstdc++.so.6 | grep "CXXABI_"
strings /usr/lib64/libstdc++.so.6 | grep "GLIBCXX_"
# 更新libstdc++.so.6.0.26
cd /usr/local
wget https://cdn.frostbelt.cn/software/libstdc++.so.6.0.26
mv libstdc++.so.6.0.26 /usr/lib64/
cd /usr/lib64
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6
ll libstdc++.so.6
此时可以正常操作node
此时配置环境变量和全局的node、npm即可在任何目录下正常运行node和npm
# 配置环境变量
vi /etc/profile
# 添加nodejs的启动路径
PATH=$PATH:/usr/local/nodejs/bin
export PATH
# 保存后重新让profile生效
source /etc/profile
# 此时node和npm均可正常运行使用了,不再局限于任何目录
# 如果不配置profile其实也可以配置软连接,相当于全局变量,效果和配置profile一样
# 推荐使用profile配置,当然两种同时配置也可以
ln -s /usr/local/nodejs/bin/node /usr/local/bin
ln -s /usr/local/nodejs/bin/npm /usr/local/bin
测试项目
随便上传一个需要node环境的demo,注意依赖要包含在上传的文件中
此时说明npm命令是没问题的,只不过grunt没有权限,修改该目录的权限即可
# 修改grunt的权限
chmod +x /opt/demo/node_modules/.bin/grunt
# 执行npm
npm run start
# 后台执行npm
npm run start &