Error: /lib64/libm.so.6: version `GLIBC_2.38' not found
(required by node_modules/sqlite3/build/Release/node_sqlite3.node)
典型场景:本地 Ubuntu 24 编译后,将整个 node_modules 上传到 CentOS 7 / Rocky 8 / 老 Ubuntu 服务器,因为 glibc 版本不匹配,native addon 加载失败。
确认系统 glibc 版本
ldd --version
# ldd (GNU libc) 2.17 ← 远低于 2.38
sqlite3 native addon 编译时用了 GLIBC_2.38 的符号,但服务器的 /lib64/libm.so.6 只支持到 2.17,因此 dlopen 失败。
解决方案
方案 1:服务器重新编译(推荐)
在目标服务器上重新安装或重编译 native 模块:
# 进入项目目录
cd /your/project
# 先删除已有 node_modules
rm -rf node_modules package-lock.json
# 重新安装(会在当前服务器编译 .node 文件)
npm install
# 或者只重编译 sqlite3
npm rebuild sqlite3
如果编译报错,需要先安装编译工具链:
CentOS / RHEL:
yum groupinstall "Development Tools" -y
yum install python3 gcc gcc-c++ make -y
Ubuntu / Debian:
apt install build-essential python3 make g++ -y
然后再执行 npm rebuild sqlite3。
方案 2:不要跨系统上传 node_modules
根本原因是 native addon 的 .node 文件是平台相关的二进制,不能跨系统复用。正确的部署流程:
# 本地:只上传源码,不上传 node_modules
git push # 或 scp 项目文件,排除 node_modules
# 服务器:安装
npm install
将 node_modules/ 加入 .gitignore 和 rsync --exclude。
方案 3:改用 better-sqlite3
sqlite3 的 native binding 经常出现编译问题。better-sqlite3 维护更活跃且通常编译更顺畅:
npm uninstall sqlite3
npm install better-sqlite3
API 略有不同(同步而非回调),迁移成本视代码量而定。
为什么 GLIBC 版本不能降级升级
glibc 是系统核心库,版本升级风险极高(可能导致系统无法启动),降级几乎不可能。唯一可靠的方式是在目标环境重新编译,或用 Docker 把运行环境固定下来:
FROM node:18-bullseye-slim
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]
容器化后 glibc 版本由镜像固定,不再受宿主机影响。
