很多同学node项目使用 argon2 的时候,在项目部署时总会遇到各种问题,我这里记录一下解决办法,基本通用。
安装 argon2, 官方地址:https://github.com/ranisalt/node-argon2
服务器是aarch64架构,操作系统是 Kylin V10
argon2 版本是 0.40.1
gcc 版本是 7.3.0
node 版本是 18.20.1
首先确保安装了gcc和g++
查看 gcc 和 g++ 的版本
gcc --version
g++ --version
在node项目目录安装 argon2
--build-from-source 参数是为了强制重新编译 argon2 模块
npm install --build-from-source
如果安装 argon2 报错:npm ERR! make: gcc-7: Command not found
node版本如果是18.20.1是不会报错的,如果是其他版本如18.15.0就会报错
查看 gcc 的位置
whereis gcc 或者 ls -l /usr/bin/gcc*
根据 gcc 的位置设置环境变量
export CC=/usr/bin/gcc
export CXX=/usr/bin/g++
确保环境变量设置正确,这应该输出 gcc 和 g++。
echo $CC
echo $CXX
持久化环境变量,这样,每次登录时,这些环境变量都会自动设置。
echo "export CC=/usr/bin/gcc" >> ~/.bashrc
echo "export CXX=/usr/bin/g++" >> ~/.bashrc
source ~/.bashrc
如果项目运行报错:
node: symbol lookup error:node_modules/argon2/build/Release/argon2.node: undefined symbol: argon2_ctx
检查 libargon2 是否正确安装
yum list installed | grep libargon2 或者 dnf list installed | grep libargon2
# 如果 libargon2 没有安装,可以使用以下命令安装
# yum install libargon2
# yum install libargon2-devel
确认 argon2 库的版本
rpm -qi libargon2
确认 libargon2 库的位置,我的路径是 /usr/lib64/libargon2.so.0
find / -name "libargon2.so*" 2>/dev/null
# 如果输出只有 /usr/lib64/libargon2.so.0,而没有 /usr/lib64/libargon2.so
# 可以创建一个符号链接用于链接到 libargon2.so.0,因为 argon2 模块可能需要 libargon2.so
ln -s /usr/lib64/libargon2.so.0 /usr/lib64/libargon2.so
# 再次确认 libargon2 库的位置
find / -name "libargon2.so*" 2>/dev/null
# 输出应该包含 /usr/lib64/libargon2.so.0 和 /usr/lib64/libargon2.so
# 确保环境变量 LD_LIBRARY_PATH 包含 libargon2 的路径
# libargon2 库在 /usr/lib64 目录下,所以需要将该目录添加到 LD_LIBRARY_PATH 中
export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH
# 持久化环境变量,这样,每次登录时,这些环境变量都会自动设置。
echo 'export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 重新编译 argon2 模块
cd /home/www/wwwroot/baswei/node_modules/argon2
npm rebuild --build-from-source
# 确保正确的 argon2 库被链接到 argon2 模块
# 如果输出中包含了 libargon2.so.0 => /usr/lib64/libargon2.so.0,这意味着 argon2 模块正确链接到 libargon2 库
ldd /home/www/wwwroot/baswei/node_modules/argon2/build/Release/argon2.node
# 确认 libargon2.so 是否包含 argon2_ctx 符号,如果没有输出,这意味着库可能不包含所需的符号,或者库版本不正确
nm -D /usr/lib64/libargon2.so | grep argon2_ctx
# 运行项目
npm run start:dev
# 如果还是报错:node: symbol lookup error: /home/www/wwwroot/baswei/node_modules/argon2/build/Release/argon2.node: undefined symbol: argon2_ctx
# 修改 argon2 模块的 binding.gyp 文件
cd /home/www/wwwroot/baswei/node_modules/argon2
vi binding.gyp
找到 "target_name": "argon2" 的部分,并在该部分中添加 libraries 字段。确保包含 -L/usr/lib64(库的路径)和 -largon2(库的名称),这可以确保在编译 argon2.node 时链接到正确的 libargon2 库。
# {
# "target_name": "argon2",
# "defines": [
# "NAPI_VERSION=(napi_build_version)",
# "NODE_ADDON_API_DISABLE_DEPRECATED",
# "NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED"
# ],
# "sources": [ "argon2.node.cpp" ],
# "cflags_cc!": [ "-Wall", "-Wextra", "-Wconversion", "-Wformat", "-Wnon-virtual-dtor", "-pedantic", "-Werror" ],
# "cflags_c!": [ "-fno-exceptions" ],
# "include_dirs": [ "<!(node -e \"require('node-addon-api').include_dir\")" ],
# "dependencies": [ "libargon2" ],
# "libraries": [ // 添加这一行
# "-L/usr/lib64", // 指定库的搜索路径
# "-largon2" // 链接 libargon2 库
# ],
# "configurations": {
# "Debug": {
# "conditions": [
# ["OS=='linux'", {
# "cflags": [ "-O0", "-fprofile-arcs", "-ftest-coverage" ],
# "ldflags": [ "-fprofile-arcs", "-ftest-coverage" ]
# }]
# ],
# "defines!": [ "NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS" ]
# }
# }
# }
# 重新编译 argon2 模块
cd /home/www/wwwroot/baswei/node_modules/argon2
npm rebuild --build-from-source
# 检查 argon2 模块是否正确链接到 libargon2 库,查看输出中是否包含了指向 /usr/lib64/libargon2.so 的路径
ldd /home/www/wwwroot/baswei/node_modules/argon2/build/Release/argon2.node
# 运行项目
npm run start:dev