/tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 Vercel
Posted
技术标签:
【中文标题】/tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 Vercel【英文标题】:/tmp/chromium: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory Vercel 【发布时间】:2021-05-18 17:23:43 【问题描述】:当我尝试访问上传到 vercel 服务器上的 API 时,我收到了这个错误。
有人遇到同样的错误吗?
当我在本地运行它时,它工作正常。
2021-02-15T19:38:59.218Z 0109b575-a2e7-478e-aefe-aa3335b5b6b8 ERROR 错误:无法启动浏览器进程! /tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 疑难解答:https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md 在 onClose (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:193:20) 在界面。 (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:183:68) 在 Interface.emit (events.js:327:22) 在 Interface.close (readline.js:424:8) 在 Socket.onend (readline.js:202:10) 在 Socket.emit (events.js:327:22) 在 endReadableNT (internal/streams/readable.js:1327:12) 在 processTicksAndRejections (internal/process/task_queues.js:80:21)
代码
import puppeteer, Page from 'puppeteer-core'
import chrome from 'chrome-aws-lambda'
export async function getOptions()
const isDev = !process.env.AWS_REGION
let options;
const chromeExecPaths =
win32: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
linux: '/usr/bin/google-chrome',
darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
const exePath = chromeExecPaths[process.platform]
if (isDev)
options =
args: [],
executablePath: exePath,
headless: true
else
options =
args: chrome.args,
executablePath: await chrome.executablePath,
headless: chrome.headless
return options
let _page: Page | null
async function getPage(): Promise<Page>
if (_page)
return _page
const options = await getOptions()
const browser = await puppeteer.launch(options)
_page = await browser.newPage()
return _page
export async function getScreenshot(html: string, width, height = width: 800, height: 800 )
const page = await getPage();
await page.setContent(html);
await page.setViewport( width, height );
const file = await page.screenshot( type: 'png' );
return file;
【问题讨论】:
【参考方案1】:我遇到了同样的问题,即 puppeteer 在我的本地环境中运行良好,但是当我部署到 AWS EC2 时,我遇到了同样的错误共享加载库 解决方案
-
首先检查您正在运行的 nodejs 的版本,以及它是否低于 v14.0 或高于 v14.0。升级或降级(建议升级)并重新启动您的应用,然后尝试。
最常见的原因是 Node.js v14.0.0 中的一个错误,它破坏了 extract-zip,Puppeteer 使用该模块将浏览器下载提取到正确的位置。该错误已在 Node.js v14.1.0 中修复,因此请确保您运行的是该版本或更高版本。或者,如果您无法升级,您可以降级到 Node.js v12,但我们建议尽可能升级。
-
琐碎:-确保您的项目文件夹所在的目录不属于root。
对于那些在 windows 环境下运行时可能遇到此问题的人,您可以尝试在从代码启动 chromium 时传递 ignoreDefaultArgs: ['--disable-extensions'] 选项,即 p>
const browser = await puppeteer.launch(ignoreDefaultArgs: ['--disable-extensions'])
这将停用 puppeteer 的默认行为,以禁用 chromium/chrome 通常使用的任何扩展。
Linux 和 MACOS 使用
导致此错误的问题
UnhandledPromiseRejectionWarning:错误:无法启动浏览器进程! 加载共享库时出错:libnss3.so: cannot open shared object file: No such file or directory TROUBLESHOOTING
大部分但并非所有时间都是由最新版本中所需的缺失引起的。好消息是您可以轻松检查导致崩溃的缺失 chrome 依赖项。
确保您位于项目的根文件夹中 导航到 node_modules 文件夹 导航到安装 puppeteer chrome linux 工具的文件夹cd /project_folder/node_modules/puppeteer/.local-chromium// 将 blockqoutes 替换为路径中显示的目录 ls at /.local-chromium 以检查目录名称
在最后一个目录 运行下面的命令来检查缺少的依赖项
ldd 铬 | grep 不
如果您发现任何缺少的依赖项,请运行此命令以安装所有内容并重新启动您的应用程序。
sudo apt-get install ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils
瞧!!一切都应该修复
【讨论】:
安装依赖项对我有用。谢谢老哥! 谢谢你,安德鲁,这很有效!!【参考方案2】:尝试添加jontewks/puppeteer-heroku-buildpack buildpack。添加这个 buildpack 对我有用。
heroku buildpacks:add jontewks/puppeteer
也不要忘记通过提交触发构建。
【讨论】:
截至 2021 年 12 月为我工作 该死的,这破坏了我的 nodejs 应用程序 - 新的提交不再可能:´´´警告:多个默认构建包报告了处理此应用程序的能力。下面列表中的第一个 buildpack 将被使用´´´【参考方案3】:对于在 aws lambda 上遇到 libnss3.so: cannot open shared object file
问题的任何人。对我来说,解决方法是将 chrome-aws-lambda
和 puppeteer-core
都提升到 >= 6.0.0 - 这是运行 runtime: nodejs14.x
时所需的最低版本。
【讨论】:
在将版本升级到 >= 6.0.0 之后,您可以在 Lambda 上运行它吗? zip 文件没有超过 lambda 大小限制吗?【参考方案4】:感谢@andrew-mititi 和他的awesome answer,我能够在我的环境中解决问题,即Docker FROM node:16(即Debian GNU/Linux 10) + puppeteer v13(不是 puppeteer-core)。我做了以下步骤:
构建并运行 Docker 容器:make build & docker run
转到容器:docker exec -it CONTAINER_ID /bin/bash
找到 pptr chromium 文件夹:ls project_folder/node_modules/puppeteer/.local-chromium
,在我的情况下是 linux-961656
找到下一个文件夹:ls project_folder/node_modules/puppeteer/.local-chromium/linux-961656
,它是chrome-linux
在该文件夹中运行缺失依赖项脚本:ldd node_modules/puppeteer/.local-chromium/linux-961656/chrome-linux/chrome | grep not
,它应该显示类似
libnss3.so => not found
libnssutil3.so => not found
libsmime3.so => not found
libnspr4.so => not found
libatk-1.0.so.0 => not found
libatk-bridge-2.0.so.0 => not found
libcups.so.2 => not found
libdrm.so.2 => not found
libdbus-1.so.3 => not found
libxkbcommon.so.0 => not found
libXcomposite.so.1 => not found
libXdamage.so.1 => not found
libXfixes.so.3 => not found
libXrandr.so.2 => not found
libgbm.so.1 => not found
libasound.so.2 => not found
libatspi.so.0 => not found
最后一步是将此列表转换为正确的 apt-get 命令,并在安装项目的 npm 依赖项后将其添加到 Docker make-script 中。在我的情况下是:
RUN apt-get update && apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2
【讨论】:
以上是关于/tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 Vercel的主要内容,如果未能解决你的问题,请参考以下文章
加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)
加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录
/usr/share/code/bin/../code:加载共享库时出错:libX11-xcb.so.1:无法打开共享对象文件: