本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.
前言
前一段时间 Nuxt Content v3 版本发布后便趁机将管理的一个网站更新到了最新版本,结果发布到阿里云函数计算上以后始终访问不到 content 目录下的内容,本地开发预览完全没问题,但线上始终提示找不到文件,考虑到还有其他任务需要完成,于是放弃更新,留着后续有空了再仔细调试。
正文
今天得空通过 FC 的控制台登录到运行中的实例上去看了一下,对比了一下线上环境里的文件数量和本地构建完以后的文件数量,发现数量一致,因此构建和部署过程大概率没问题。
本地通过 node server/index.mjs 启动以后观察到根目录下新创建出了一个 contents.sqlite 的文件,但线上的文件列表里却没有这个文件,因此考虑线上的应用启动过程出了问题。
启用函数计算的日志后再次访问测试环境,以便重新创建函数实例来观察启动过程是否有异样,结果还真是由于环境问题导致的:
2025-03-14 11:31:44[request error] [unhandled] [POST] http://localhost/api/content/content/query?v=v3.3.0--qLYywg2Jop
H3Error: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found
(required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node)
at Module._extensions..node (node:internal/modules/cjs/loader:1473:18) ... 8 lines matching cause stack trace ...
at Object.all (file:///code/server/chunks/nitro/nitro.mjs:4613:17)
{ cause: Error: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found
(required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node)
at Module._extensions..node (node:internal/modules/cjs/loader:1473:18)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Module._load (node:internal/modules/cjs/loader:1023:12)
at Module.require (node:internal/modules/cjs/loader:1235:19)
at require (node:internal/modules/helpers:176:18)
at bindings (/code/server/node_modules/bindings/bindings.js:112:48)
at new Database (/code/server/node_modules/better-sqlite3/lib/database.js:48:64)
at getDB (file:///code/server/chunks/nitro/nitro.mjs:4577:11)
at Object.prepare (file:///code/server/chunks/nitro/nitro.mjs:4585:44)
at Object.all (file:///code/server/chunks/nitro/nitro.mjs:4613:17)
{ code: 'ERR_DLOPEN_FAILED' },
statusCode: 500,
fatal: false,
unhandled: true,
statusMessage: undefined,
data: undefined }
看了一下报错日志,发现是环境里缺少 libc 相关的文件导致 better_sqlite3 模块没法正常工作。
那么解决方案就出来了:
- 看看 Nuxt Content v3 是否支持其他的 sqlite 读写模块
- 找一个合适的 Libc 作为函数计算的层补充到运行环境里去
- 更换函数计算的运行时为自定义容器
尝试方案 1 更换 sqlite 读写模块,翻源码后发现 Nuxt 优先尝试加载 sqlite3 模块,找不到的情况下尝试使用 better_sqlite3 模块,因此我们只需要手动安装一下 sqlite3 到项目里就行。
然并卵,发布到测试环境后依然使用的是 better_sqlite3,依然提示 libc 错误:
2025-03-14 13:39:06Listening on http://[::]:3000 Failed to execute SQL CREATE TABLE IF NOT EXISTS _content_info (id TEXT PRIMARY KEY, "ready" BOOLEAN, "structureVersion" VARCHAR, "version" VARCHAR, "__hash__" TEXT UNIQUE);
-- structure: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found
(required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node)
Failed to execute SQL INSERT INTO _content_info VALUES ('checksum_content', false, 'DjRIbndRGL', 'v3.3.0--qLYywg2Jop', 'OKFbrWvbn3'); -- meta: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /code/server/node_modules/better-sqlite3/build/Release/better_sqlite3.node)
行吧,那就尝试修复运行环境吧,考虑到找一个合适的 libc 文件并不容易,而且还需要发布一个层到函数计算,操作流程比使用自定义容器部署函数计算实例要长一些,因此考虑直接一步到位换自定义容器。
更换完自定义容器以后,content 目录下的内容就可以正常显示了。
相关内容
- [Aliyun] [FC] [CDN] 如何使用 refresh-cdn-cache 插件在网站部署后自动刷新 CDN 缓存
- 如何使用阿里云 CDN 对部署在函数计算上的静态网站进行缓存
- 如何使用 website-fc 插件部署静态网站到函数计算
- github.com/DevDengChao…
- github.com/devsapp/web…
- github.com/Serverless-…
- 阿里云 函数计算
- 阿里云 CDN