PM2 和 Puppeteer 结合使用的注意事项及解决方案

阅读时长 7 分钟读完

介绍

PM2 是一个生产环境下的 Node.js 进程管理器,可以帮助我们管理 Node.js 进程,提供了很多有用的功能,比如启动多个进程,日志输出等等。而 Puppeteer 是一个 Node.js 库,提供了一套更高级、更安全和更无痕的网页自动化方案,可以实现自动化的网页操作,比如网页截图、自动填写表单等等。

本文是针对前端工程师的,将介绍如何在前端项目中使用 PM2 和 Puppeteer 完成自动化任务,以及一些注意事项及解决方案。

为什么需要 PM2 和 Puppeteer 结合使用

前端工程师通常需要使用 Puppeteer 实现一些自动化任务,比如自动化测试或者数据爬取等等。这些任务通常需要在服务器上运行,而 PM2 是一个非常好的 Node.js 进程管理器,更好地完成了它的职责 - 程序自动重启、监控、负载均衡等等。

所以,PM2 和 Puppeteer 结合使用是非常完美的选择。

如何使用

以下是一个 PM2 和 Puppeteer 结合使用的示例代码:

-- -------------------- ---- -------
----- --------- - ---------------------
----- ------- - -------------------
----- ---- - ----------------
----- --- - ----------

--------------------- ----- ----- ---- -- -
  ----- ------- - ----- -------------------
  ----- ---- - ----- ------------------
  ----- -----------------------------------
  ----- ----- - ----- -------------
  ----- ----------------
  ----------------
---

------------------------------------

以上代码使用了 Express,创建了一个 HTTP 服务器,当访问 /puppeteer 路径时,会执行 Puppeteer 的相关代码,获取百度的标题,并将其返回。

接下来我们使用 PM2 启动该服务:

以上命令会启动 index.js 程序,同时以 test-puppeteer 为名称,将进程封装到 PM2 进程管理器中。

在 Docker 中使用

如果你使用 Docker 部署这个服务,在 Docker 镜像中需要安装 Chrome 浏览器,Puppeteer 在使用时需要 Chromium,这里推荐一个 headless-chrome Docker 镜像,它包括了 Chrome 和一些安装 Puppeteer 所需要的库。

你可以使用以下命令启动镜像:

--cap-add=SYS_ADMIN 参数是必须的,因为 Puppeteer 在启动时需要运行一个 SUID Sandbox 进程,而这个进程需要 /dev/shm 权限。

使用这个镜像时,Puppeteer 的相关代码需要配置如下:

以上代码使用了 puppeteer.connect 方法,配置 browserWSEndpoint 属性,使其连接到上面启动的 Docker 镜像。

注意事项及解决方案

使用 headless 模式

默认情况下,Puppeteer 的 headless 模式是禁用的(即会有窗口弹出),如果你想在服务器中运行 Puppeteer,你需要启用 headless 模式,以减少服务器资源的消耗。

以下是启用 headless 模式的示例代码:

启动 Chromium 失败

在使用 Puppeteer 时,你可能会遇到 Chromium 启动失败的情况,这通常是由于文件权限不足或者是服务器内存不足等问题导致的。

解决方案如下:

  1. 检查是否有这么一个目录 ~/.config/chromium/Default/Service Worker/CacheStorage/,如果有,请删除该目录。

  2. 增加内存。可以在启动 Docker 容器时,通过 --memory--memory-swap 参数增加内存容量。

  3. 启用 no-sandbox 模式。启用 no-sandbox 模式的方法如下:

启动 Chrome 时提示临时文件夹不可用

在启动 Chrome 浏览器时,可能会提示如下错误:

这个错误通常是由于 Chrome 的配置问题,可以尝试以下两种解决方案:

  1. 禁用 Chrome 的 seccomp 模块,在使用 Puppeteer 时,可以通过如下方式禁用该模块:

    -- -------------------- ---- -------
    ----- ------- - ----- ------------------
      ----- -
        ----------------------------------
        ----------------------------------------
        -------------------------
        -----------------------
        -------------------------
        ---------------------------
        -----------------------------
        -----------------
        ------------------
        ---------------------------
        -----------------
        ---------------
        ---------------
        ---------------------------
        ---------------------
        -------------------------------------
      -
    ---
  2. 在启动 Docker 容器时,加入 --privileged 参数。这个参数会让容器拥有所有的系统权限,虽然不是最安全的做法,但可以快速解决此问题。

结论

本文介绍了 PM2 和 Puppeteer 结合使用的注意事项及解决方案,并提供了示例代码。希望通过本文,让读者更好地掌握如何在前端项目中使用 PM2 和 Puppeteer 完成自动化任务。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675159878bd460d3ad88c07c

纠错
反馈