/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-lambdapuppeteer-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 &amp; 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的主要内容,如果未能解决你的问题,请参考以下文章

加载共享库时出错:libncurses.so.5:

加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)

加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录

/usr/share/code/bin/../code:加载共享库时出错:libX11-xcb.so.1:无法打开共享对象文件:

加载共享库时出错:libgfortran.so.1:无法打开共享对象文件:没有这样的文件或目录

docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作