Ubuntu 18.04安装Node.js全攻略:四种方式对比与排坑指南

发布时间:2026/10/18 21:59:22
Ubuntu 18.04安装Node.js全攻略:四种方式对比与排坑指南 1. 前言为什么在 Ubuntu 18.04 上装个 Node.js 也有这么多讲究以前开发环境配错了顶多也就是项目跑不起来但 2023 年之后还在用 Ubuntu 18.04 的朋友多半是碰上老项目维护、内网环境限制、或者 CI/CD 流程里锁定了系统版本。这套系统虽然已经过了生命周期但在生产环境和遗留项目里的存量依然很多所以“在 Ubuntu 18.04 上装 Node.js”根本不是选个命令敲三行那么简单的事——它牵扯到 GLIBC 版本、编译器环境、nvm 兼容性、npm 源加速、以及多版本共存等一系列实际问题。我这次把完整的安装思路和实操过程整理成文不吹什么“唯一最优解”只把各种方式的适用场景、真实操作、踩坑记录摊开来讲。这篇内容适合谁看?你说你在 18.04 上部署过 Node 服务结果发现 apt 源里的是 v8.x你说你是前端开发想在服务器上同时跑一套旧项目和一套新项目;你说你只是想自己搭个环境练手又不想把系统搞坏——这些都是我写这篇的初衷。2. 安装方式盘点先弄清每种方案的定位再动手2.1 四种主流方式的特点对比在 Ubuntu 18.04 上走 Node.js主流思路基本可以分成四类系统包管理器、NodeSource 仓库、版本管理工具 nvm、源码编译安装。这四类方案的定位完全不同先用一张表把它们的核心差异说清楚再逐个拆解实操。安装方式安装版本类型适合场景主要风险apt 安装旧版本实测多为 v8.x/v10.x快速起服务、系统工具脚本版本过旧ES2020 语法不兼容NodeSource 仓库指定 lts/最新版生产环境单版本部署添加第三方源需注意信任策略nvm任意版本、多版本共存多项目并行开发、版本切换每次打开终端需自动加载源码编译官方任意版本离线环境、内网部署、特殊架构依赖主机编译工具链耗时较长这个表不是拿来背的核心其实是四个问题你所在环境允不允许外网访问、你到底需要几个 Node 版本、安装完之后需不需要持续维护、以及系统本身是不是干净的老环境。我实际测下来不同的答案基本会对号入座到不同的方案上。2.2 版本选型原则为什么不要瞎追偶数大版本版本选择这件事先说个原则在 Ubuntu 18.04 上跑 Node.js如果项目没有硬性要求优先选 LTS 版本尤其不要盲目上最新的 Current 版本。18.04 自带的 GLIBC 是 2.27N-API 在旧版本上虽然也能用但原生模块要重新编译的情况非常常见。另一个现实问题是许多基于 Node 的工具链比如旧版的 Sass、某些企业的私有 SDK在太新的 Node 版本上反而跑不起来。从我接手过的实际项目来看18.04 上最稳妥的是 Node.js 14.x 和 Node.js 16.x 这两个 LTS 大版本。14.x 对老项目兼容性最好很多遗留的 C 模块不需要重编就能继续用16.x 在性能和新语法上更均衡如果项目已经迁移到 ESM 模块风格16.x 会更省心。至于 Node.js 18.x 及以上虽然在 18.04 上可以安装使用但模块编译失败的概率明显升高原因就是 Ubuntu 18.04 的编译环境和更新版本的 V8/OpenSSL 之间存在兼容性问题。这属于实操教训不是网上抄来的理论。3. 方式一系统 apt 直接安装——最快但版本最旧3.1 安装命令与常见软件包说明Ubuntu 18.04 官方源里的 Node.js 版本很旧但好处是命令极短、不需要添加任何额外源也不会对你的系统造成任何“额外污染”sudo apt update sudo apt install nodejs npm -y装完之后有两个细节一定要确认不然项目起来的时候会一脸懵node -v npm -v你会发现 node 版本基本上停留在 v8.10.0 或 v10.x 左右npm 则可能是 v5.x/v6.x。我实测时发现18.04 官方源里 nodejs 版本不到 8.11npm 也只有 5.6 左右。这个 npm 版本对很多现代前端工程的用法支持不佳运行npm ci时会报“不支持的锁文件版本”之类的错误。3.2 为什么 apt 安装的 node 经常自带一个“nodejs”命名困扰用 apt 方式装完你很可能在终端里输入node发现命令不存在得输入nodejs才可用。这不是机器坏了而是 Debian/Ubuntu 体系里很早就有个叫node的软件包一个无线电中继程序为了避免命名冲突官方把 Node.js 的命令改成了nodejs。很多教程没讲这层原因导致新手在这卡半天。如果你不想每次都敲nodejs最简单的方式是做一个软链接sudo ln -s /usr/bin/nodejs /usr/bin/node另外一个常见问题是npm自带的全局安装目录权限。apt 装完之后会把全局包放在/usr/lib/node_modules或/usr/share/nodejs普通用户写不进去于是很多新手会在/usr/lib/node_modules前加sudo结果造成模块权限混乱。解决办法不是用 sudo 装包而是把 npm 的全局目录改到用户目录下mkdir -p ~/.npm-global npm config set prefix ~/.npm-global echo export PATH~/.npm-global/bin:$PATH ~/.bashrc source ~/.bashrc3.3 apt 安装方式的适用范围与放弃理由单就安装速度来说apt 方式五秒之内就能结束战斗。但我们必须承认Node 生态迭代太快了v8.x 和 v10.x 连?.可选链语法都不支持更别提fetch这类实验性 API。所以我把这条路径定位成“应急备份方案”——比如你只是想运行一个简单的定时脚本或者测试一下本机能不能跑 Web 服务apt 夠用但如果你要正经跑现代项目下面几个方式更合适。4. 方式二NodeSource 安装源——生产环境最常用的方案4.1 手动添加 NodeSource 仓库的过程NodeSource 是业界公认维护比较好的第三方 Node.js 仓库它做的事情其实很简单把官方发布的各种版本 Node.js 打包成适配 Ubuntu 的 deb 软件包再通过 apt 分发。配置完 NodeSource 之后你用apt install nodejs命令安装到的就是指定版本的 Node.js而不是系统源里的老版本了。我惯用的操作是登录服务器后直接用官方提供的一键脚本curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs这里走的 16.x 是截至写这篇文章时比较均衡的选择。如果你要 14.x把下载地址里的16.x替换成14.x就行。值得强调一下一键脚本里-E参数代表保留当前用户的环境变量在某些代理环境里这是保命参数不加的话脚本里 curl 下载依赖包时可能走不了代理。装完了顺手验证node -v npm -v通常你会看到v16.20.2和9.6.x这样的组合已经能覆盖绝大多数现代前端工程所需的最低版本要求了。4.2 NodeSource 的安全限制与新版本安装逻辑默认情况下NodeSource 只打包 Node.js LTS 和 Current 两类版本它的软件仓库密钥是自动配置的你不会遇到NO_PUBKEY问题。但有个细节如果你用的是很老的 Ubuntu 版本并且系统里的 ca-certificates 包版本过低curl 走 https 下载时会失败。所以安装前我建议搞一套预防动作sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg如果之前已经添加过其他 Node.js 源而你想切换版本比如从 14.x 切到 16.x一定不要直接跑 setup 脚本否则仓库里可能留下两套版本记录。正确做法是先把旧源清理干净再添加sudo rm -f /etc/apt/sources.list.d/nodesource.list sudo rm -rf /etc/apt/keyrings/nodesource.gpg sudo apt-get update这一招在实际排障时帮我解决了不少版本混乱问题诚心建议在切换版本前照做。4.3 NodeSource 安装的注意事项千万不要用 sudo npmNodeSource 装完之后有一个隐藏坑它会自动把 npm 全局安装目录指向/usr前缀相关路径这意味着你不加 sudo 往往写不进去。于是很多教程直接建议sudo npm install -g xxx短期用没问题时间长了你会突然在某天发现某个全局包权限不对或者不同项目跑起来依赖不同全局包版本冲突得让人头大。另外一个系统性风险是如果某台机器被多人使用sudo npm install -g相当于给所有人共享同一套全局包这和你“按项目隔离依赖”的思路是冲突的。因此我在生产服务器上的习惯是NodeSource 装归装但紧接着就把 npm 全局目录改到普通用户目录mkdir -p ~/.npm-global npm config set prefix ~/.npm-global echo export PATH~/.npm-global/bin:$PATH ~/.bashrc source ~/.bashrc改完后再npm i -g pm2、npm i -g yarn就没有 sudo 什么事了。如果你已经在全局装了乱七八糟的包想迁移目录直接npm ls -g --depth0列出清单然后逐一重装即可。5. 方式三nvm 多版本管理——前端开发者的流动性需求5.1 nvm 的安装过程与 Bash 加载机制nvm 在我看来不仅仅是一个安装工具更是一种“环境管理哲学”。它的出现是因为开发者的需求本来就复杂公司 A 老项目用 Node 12公司 B 新项目用 Node 18你本地不可能反复卸载重装。nvm 的思路很直白——把每个 Node 版本装到~/.nvm/versions/node/下面然后通过改环境变量PATH来切换当前默认使用的版本。Ubuntu 18.04 上装 nvm 的命令是curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash执行完之后 nvm 的安装脚本会自动在你的~/.bashrc末尾追加一段加载代码。这里我要提醒一句不是每个人默认 shell 都是 bash。我当时在一个新环境echo $SHELL出来是 zsh结果直接source ~/.bashrc后发现nvm命令根本不存在。正确做法是看安装脚本文末的提示如果是 zsh就要把它追加的那几行同样复制到~/.zshrc里。令许多新手意外的是nvm 并不是一个传统意义上的系统服务它只是一组 shell 函数。所以每次新开终端它都需要“重新加载”一次如果你在 Dockerfile 里用 nvm 装 Node一定要记得在每一层RUN中执行source ~/.nvm/nvm.sh否则后续命令找不到node。5.2 nvm 的常用操作和版本共存实测nvm 的日常操作极度简洁nvm ls-remote --lts # 查看所有 LTS 版本 nvm install 16.20.2 # 安装指定版本 nvm use 16.20.2 # 临时切换版本 nvm alias default 16.20.2 # 设置默认版本 nvm ls # 查看本地已装版本我实际测试时在同一台 Ubuntu 18.04 上装了 v10.24.1 和 v16.20.2再跑一个老项目和一个小型 Express 服务没发生任何相互干扰。这个体验用二进制发行版是做不到的也是 nvm 最值钱的地方。还有一点容易被忽略nvm 安装的 Node.js 自带 npm且 npm 的全局包也是按 Node 版本隔离的。比如你在 Node 10 下npm i -g create-react-app切到 Node 16 后这个命令就不存在了——因为~/.nvm/versions/node/v10.24.1/lib/node_modules和v16.20.2的是两套完全独立的目录。这其实是特性不是 bug如果某些全局工具需要跨版本用可以装个global目录级别的软链来解决但大多数场景根本不需要。5.3 nvm 在 Ubuntu 18.04 上的具体坑位glibc 与 curl 问题nvm 安装 Node 时会先去 Node 官方下载预编译二进制包然后解压到~/.nvm。这里最容易踩坑的是老版本 Node比如 v8.x/v9.x在 Ubuntu 18.04 上虽然能装上但运行时可能报./node: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28 not found。这个报错的含义是系统 GLIBC 版本太低满足不了新版 Node 编译时的要求。Ubuntu 18.04 自带 GLIBC 2.27所以如果你用 nvm 装 v18.x 及以上的新版 Node某些模块可能要调用更高版本 GLIBC 的函数直接崩给你看。解决办法有三个方向一是降级 Node 版本到 16.x 及以下二是不要试图升级系统 GLIBC风险极大可能把系统弄崩溃三是如果一定要用新版 Node建议基于 Docker 镜像部署而不是硬扛宿主系统。另一个常见的 nvm 问题是安装脚本下载失败多半是 curl 请求 GitHub 被拦截或者代理没配。此时在~/.bashrc里给 nvm 配代理即可export http_proxyhttp://your-proxy-ip:port export https_proxyhttp://your-proxy-ip:port当然如果你能顺利访问 GitHub这一步基本不需要。6. 方式四源码编译安装——离线与特殊场景的独木桥6.1 编译安装的完整操作链路源码编译安装虽然麻烦但在特殊场景下反而比二进制安装更可靠比如你的服务器不能访问外网只能拷入安装包或者需要针对特定 CPU 指令集做优化又或者你要安装一个官方还没提供预编译包的版本。Ubuntu 18.04 上编译 Node.js 要走完下面这条链# 安装编译工具链和依赖 sudo apt-get update sudo apt-get install -y build-essential python3 python3-distutils # 下载源码包 wget https://nodejs.org/dist/v16.20.2/node-v16.20.2.tar.gz tar -xf node-v16.20.2.tar.gz cd node-v16.20.2 # 配置、编译、安装 ./configure make -j$(nproc) sudo make install这里的python3参数要特别留心旧版 Node 编译时需要 Python 2.7新版 Node 则需要 Python 3。Ubuntu 18.04 默认可能不带python3-distutils缺了这个依赖编译到中途会报ModuleNotFoundError: No module named distutils。我自己直接踩过一次所以这里先提出来。编译过程大概需要 15-30 分钟CPU 核越多越快-j$(nproc)会自动使用全部核。编完后的 Node.js 会被安装到/usr/local/bin/比/usr/bin下的优先级高输入node -v验证即可。6.2 源码编译的几个隐藏风险和真实体感源码编译最让人头疼的不是编译本身而是后续的“可维护性”。编译安装的 Node.js 不会像 apt 和 nvm 那样在系统包管理器里留下任何痕迹这意味着你以后想升级或者卸载都需要手动操作。一旦手动删除了/usr/local/bin/node相关库文件散落在/usr/local/lib里清理起来非常麻烦。另外一个隐患是云端服务器重启后如果你之前编译时把依赖装到了/usr/local某次系统更新可能覆盖这些文件导致 node 命令失效。建议在源码编译后做一个软链管理或写一个简单的部署脚本把 Node.js 路径固定下来。实话实说我在 Ubuntu 18.04 上给一个内网客户部署时用过源码编译原因是他们那边网络环境封闭得连 NodeSource 都访问不了只能靠光盘把.tar.gz拷进去。这种方式“笨”但属于唯一可行解。如果网络条件允许我仍然更推荐 NodeSource 或 nvm。7. 三种方式安装后的环境优化换源、全局目录与核心工具7.1 把 npm 默认源切换为国内镜像源这个是 Node.js 安装完成后几乎必然要做的优化。如果你身处网络环境不理想的地方直接用官方 npm 源下载依赖包慢得让人崩溃。切换成国内镜像源之后速度一般能提升一整个数量级。npm config set registry https://registry.npmmirror.com验证一下npm config get registry看到输出是https://registry.npmmirror.com就说明切换成功。你也可以在单项目根目录放一个.npmrc文件单独指定源registryhttps://registry.npmmirror.com这样做的好处是全局默认源保持不变如果未来某些私有包需要官方源或内部源可以按项目灵活切换。7.2 核心配套工具yarn 与 pnpm 的安装安装完 Node.js 后大多数人还要装包管理器。yarn 是经典之选pnpm 则是近年来的强力新秀。核心建议新项目优先 pnpm老项目沿用 yarn。npm install -g yarn pnpm注意如果你用的是 nvm 管理 Node那么yarn和pnpm会挂在当前 Node 版本对应的全局目录下切换 Node 版本后需要重新安装。所以更推荐用 corepack 来管理 pnpm但 Ubuntu 18.04 默认自带的 corepack 版本较老建议升级一下npm install -g corepack corepack enable如果遇到EACCES: permission denied先确认 npm 全局目录已经改到用户目录下比如前面提到的~/.npm-global。7.3 常用全局工具进程守护、版本控制等Node.js 装好之后运维侧和开发侧通常还需要补充一些全局工具。我用得最多的是这几类进程守护pm2是 Node 服务防挂神器生产环境基本必备。装完把服务pm2 start app.js起来重启系统后可以用pm2 startup让它开机自启。接口调试http-server可以快速把一个目录变成一个静态文件服务前端联调时用它比 Nginx 省事多了。代码规范eslint、prettier这类工具全局安装后能提高日常开发效率但有些项目会通过npx来调起本地版本的规范工具避免版本冲突。版本检查工具n是一个用 npm 安装的 Node 版本管理工具不过如果在 nvm 环境下再装n两者会互相打架这是我踩过的真实坑所以现在我只用 nvm不再用n。8. Ubuntu 18.04 专属问题清单与排查实录8.1 高危报错集合速查表这里我直接按“症状-原因-解决”的格式列成一个表格方便速查。以下都是网络上和实际操作中反复出现的高频问题症状根因解决方案GLIBC_2.28 not found系统 GLIBC 2.27 过低换装 Node 16 或更低版本npm: not found或node: command not foundPATH 未正确配置检查~/.bashrc和~/.profile中的 PATH 行Module version mismatch原生模块是针对不同 Node ABI 编译的删除node_modules后重装Python2 is required编译旧版 Node 时缺 Python 2.7安装python并指定--python/usr/bin/python2.7Cannot find module node:fs包版本与 Node 版本不匹配使用老版本 npm 或降级 NodePermission deniednpm 全局目录不可写改 npm 全局目录到用户目录install.sh执行后 nvm 命令不存在shell 是 zsh/fish复制加载脚本到对应 shell 配置这个表不是万能的但基本覆盖了 Ubuntu 18.04 上 Node.js 安装 90% 的报错场景。我在实际项目中被“Permission denied”和“GLIBC”两个问题坑得最惨它们也是最容易误导人的。8.2 典型案例切换版本后全局包全都“消失”一位开发同学在服务器上从 Node 10 切到 Node 16 后发现pm2命令不见了第一反应是“系统坏了”。我帮他排查后确认nvm 下全局包确实是按版本隔离的pm2 装在 Node 10 的全局目录下切到 Node 16 后自然看不到。处理办法也很简单切换完版本后重新npm i -g pm2即可。这个案例说明一个非常重要的问题如果你用 nvm 管理版本全局工具的重复安装成本必须提前接受。不然每次版本切换都有那么几十秒的“环境不完整”真空期对于一些自动化脚本是很危险的。8.3 典型问题Ubuntu 18.04 上“找不到 Node.js”的奇怪恢复方法还有一个值得分享的排查经历某次在 Ubuntu 18.04 上装完 NodeSource设为默认结果重启服务器后发现node -v仍然报不存在。查了一圈才明白NodeSource 的安装脚本会把自己添加到/etc/apt/sources.list.d/nodesource.list然后在apt-get upgrade时可能一起触发卸载安装流程但服务重启时 PATH 没有自动刷新。解决方式也非常简单hash -r或者干脆重启终端。这类问题看着诡异其实都是 shell 缓存和重载环节出了岔子不用慌。9. 选型决策到底该用哪一种安装方式做了这么多对比直接给结论如果你是个人开发者或者需要频繁切换项目首选 nvm如果你是要部署生产服务和单一版本长期维护首选 NodeSource如果你只是为了跑个简单脚本或者环境极简apt 也不是不能用至于源码编译除非你在离线环境工作否则没必要自讨苦吃。这里的逻辑其实很朴素版本管理工具让你“灵活”但灵活是有代价的包管理器让你“稳定”但稳定意味着锁死在特定版本策略上。不同的团队文化和项目需求天然会导向不同的安装方式。我自己的服务器上一直坚持 NodeSource nvm 的组合NodeSource 负责提供基础版本nvm 负责微调和切换。如果未来项目开始容器化部署我会在 Dockerfile 里继续沿用 nvm以便锁定准确的 Node 版本。10. 实操中的真实体会与收尾建议安装 Node.js 这件事你只要仔细阅读官方文档按部就班执行成功率很高。但“安装成功”并不等于“环境顺手”真正磨人的往往是事后环境变量、PATH 和全局模块这些细节。我个人体会最深的一点是无论你选择了哪种安装方式装好 Node.js 后的第一步永远不是急着运行代码而是先验证node和npm是否指向了你预期中的路径、版本是否符合项目要求并检查全局包是否能写入。这一步能在未来省下大量排查时间。最后再分享一条小经验养成在项目根目录使用.nvmrc文件的习惯。这个文件里只写一行版本号比如v16.20.2配合 nvm 使用后其他人进到项目目录输入nvm use就能自动切到正确版本。它是我在多项目并行开发中踩了不少坑之后找到的最顺手的状态管理方案。配置一次时间长了收益非常明显。希望这篇总结能让你在 Ubuntu 18.04 上装 Node.js 这件事上少走几步弯路。