介绍
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 启动该服务:
pm2 start index.js --name test-puppeteer
以上命令会启动 index.js
程序,同时以 test-puppeteer
为名称,将进程封装到 PM2 进程管理器中。
在 Docker 中使用
如果你使用 Docker 部署这个服务,在 Docker 镜像中需要安装 Chrome 浏览器,Puppeteer 在使用时需要 Chromium,这里推荐一个 headless-chrome Docker 镜像,它包括了 Chrome 和一些安装 Puppeteer 所需要的库。
你可以使用以下命令启动镜像:
docker run --rm --name chrome --cap-add=SYS_ADMIN -p=127.0.0.1:9222:9222 justinribeiro/chrome-headless
--cap-add=SYS_ADMIN
参数是必须的,因为 Puppeteer 在启动时需要运行一个 SUID Sandbox 进程,而这个进程需要 /dev/shm
权限。
使用这个镜像时,Puppeteer 的相关代码需要配置如下:
const browser = await puppeteer.connect({ browserWSEndpoint: 'ws://chrome:9222/devtools/browser/40d4d645-53b3-4b48-a12d-b3c6ea5a9cb1' });
以上代码使用了 puppeteer.connect
方法,配置 browserWSEndpoint
属性,使其连接到上面启动的 Docker 镜像。
注意事项及解决方案
使用 headless 模式
默认情况下,Puppeteer 的 headless 模式是禁用的(即会有窗口弹出),如果你想在服务器中运行 Puppeteer,你需要启用 headless 模式,以减少服务器资源的消耗。
以下是启用 headless 模式的示例代码:
const browser = await puppeteer.launch({ headless: true });
启动 Chromium 失败
在使用 Puppeteer 时,你可能会遇到 Chromium 启动失败的情况,这通常是由于文件权限不足或者是服务器内存不足等问题导致的。
解决方案如下:
检查是否有这么一个目录
~/.config/chromium/Default/Service Worker/CacheStorage/
,如果有,请删除该目录。增加内存。可以在启动 Docker 容器时,通过
--memory
和--memory-swap
参数增加内存容量。启用
no-sandbox
模式。启用no-sandbox
模式的方法如下:const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
启动 Chrome 时提示临时文件夹不可用
在启动 Chrome 浏览器时,可能会提示如下错误:
Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted.
这个错误通常是由于 Chrome 的配置问题,可以尝试以下两种解决方案:
禁用 Chrome 的 seccomp 模块,在使用 Puppeteer 时,可以通过如下方式禁用该模块:
-- -------------------- ---- ------- ----- ------- - ----- ------------------ ----- - ---------------------------------- ---------------------------------------- ------------------------- ----------------------- ------------------------- --------------------------- ----------------------------- ----------------- ------------------ --------------------------- ----------------- --------------- --------------- --------------------------- --------------------- ------------------------------------- - ---
在启动 Docker 容器时,加入
--privileged
参数。这个参数会让容器拥有所有的系统权限,虽然不是最安全的做法,但可以快速解决此问题。
结论
本文介绍了 PM2 和 Puppeteer 结合使用的注意事项及解决方案,并提供了示例代码。希望通过本文,让读者更好地掌握如何在前端项目中使用 PM2 和 Puppeteer 完成自动化任务。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675159878bd460d3ad88c07c