Linux部署nodejs解决18及以上版本无法运行的方案

lopaco 2024-09-14 12:37:01 阅读 99

Linux上部署nodejs首先必须确定已经准备好了虚拟机或者Linux系统,使用wget进行安装,不采取yum的形式,因为yum是下载后自动安装,而wget是下载后手动安装

下载部署nodejs

<code># 如果没有安装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也是不会变动的

<code># 查看当前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进行安装

<code># 安装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的版本,那么继续进行手动处理升级更新

<code># 下载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

<code>strings /usr/lib64/libstdc++.so.6 | grep "CXXABI_"

strings /usr/lib64/libstdc++.so.6 | grep "GLIBCXX_"

在这里插入图片描述

<code># 更新libstdc++.so.6.0.26

cd /usr/local

wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.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

<code># 配置环境变量

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没有权限,修改该目录的权限即可

<code># 修改grunt的权限

chmod +x /opt/demo/node_modules/.bin/grunt

# 执行npm

npm run start

# 后台执行npm

npm run start &

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。