无法在 Ubuntu 16.04 AWS EC2 实例上使用 puppeteer 启动 chromium headless

Posted

技术标签:

【中文标题】无法在 Ubuntu 16.04 AWS EC2 实例上使用 puppeteer 启动 chromium headless【英文标题】:Failed to launch chromium headless using puppeteer on Ubuntu 16.04 AWS EC2 Instance 【发布时间】:2021-01-10 13:22:58 【问题描述】:

我有一个微服务,其中一个 API 正在生成 PDF(基于作为参数传递的类型的 3 个 pdf)。我已经使用 puppeteer 包来生成 PDF。在我的本地系统上用作魅力。

当我尝试在 EC2 ubuntu 16.04 服务器上运行相同的微服务时,它无法无头启动 chromium。我使用了“npm i puppeteer”,据我了解,它应该将铬无头作为依赖项。

微服务运行良好,但问题在于 puppeteer 获取 chromium。

错误

Error: Could not find browser revision 800071. Run "PUPPETEER_PRODUCT=firefox npm install" or "PUPPETEER_PRODUCT=firefox yarn install" to download a supported Firefox browser binary.

另外,我在 "/node_modules/puppeteer/" 中找不到 ".local-chromium/linux-version/linux-chrom" p>

所以,我的理解是 chrome 从未安装过

我对 docker 也很满意。我只在 docker 中运行其他微服务。因此,如果有人可以建议一些使用 docker 的解决方法,那也可以。

来自微服务的相关代码部分

async function createPDF(baseFile, inp) 
var templatehtml = fs.readFileSync(
    path.join(process.cwd(), `utilities/$baseFile.html`),
    "utf8"
  );

  var template = handlebars.compile(templateHtml);

  var html = template(inp);

  var milis = new Date();
  milis = milis.getTime();

  var pdfPath = path.join(process.cwd(), `$baseFile.pdf`);

  var options = 
    width: "1100px",
    height: "1380px",
    // format: "A3",
    headerTemplate: "<p></p>",
    footerTemplate: "<p></p>",
    displayHeaderFooter: false,
    margin: 
      top: "10px",
      bottom: "10px",
    ,
    // printBackground: true,
  ;

  const browser = await puppeteer.launch(
    args: ["--no-sandbox", "--disable-setuid-sandbox"],
    headless: true,
  );

  var page = await browser.newPage();

  await page.goto(`data:text/html;charset=UTF-8,$html`, 
    waitUntil: "networkidle0",
  );

  //   await page.addStyleTag(
  //     content:
  //       "@page:first margin-top:10px; margin-right:10px; margin-bottom:30px; margin-left:10px;",
  //   );

  const pdf = await page.pdf(options);
  await browser.close();
  return pdf;

npm i puppeteer

的输出
 npm i puppeteer

> puppeteer@5.3.1 install /home/ubuntu/vendor-module/node_modules/puppeteer
> node install.js

(node:18339) UnhandledPromiseRejectionWarning: /home/ubuntu/vendor-module/node_modules/puppeteer/lib/cjs/puppeteer/install.js:138
                    catch 
                          ^

SyntaxError: Unexpected token 
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at download (/home/ubuntu/vendor-module/node_modules/puppeteer/install.js:35:7)
(node:18339) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

【问题讨论】:

【参考方案1】:

Puppeteer Error: Chromium revision is not downloaded - 这个链接帮助我调试我需要在 puppeteer 中手动运行 install.js。

https://github.com/puppeteer/puppeteer/issues/3443 - 此链接用于其他所有内容。

另外,apt-get install libgbm-dev

【讨论】:

对于研究docker的人-medium.com/@christopher.talke/…另外,文章开头有一个简单部署的参考。所以,这也很有帮助

以上是关于无法在 Ubuntu 16.04 AWS EC2 实例上使用 puppeteer 启动 chromium headless的主要内容,如果未能解决你的问题,请参考以下文章

NVidia 驱动程序停止在带有 Ubuntu 16.04 和 Tesla K80 GPU 的 AWS EC2 实例上工作

无法从我的ubuntu EC2计算机连接到AWS DocumentDB

无法在 AWS EC2 (Ubuntu) apache 系统上 SSL Godaddy 验证证书

无法从我的本地 ubuntu 机器推送到 aws ec2

通过 Ubuntu 堡垒到私有子网中的 EC2 实例的 SSH 隧道

无法使用 Node.js 和 AWS EC2 访问 mysql 服务器