Puppeteer 项目Docker 部署方案

13 min read

镜像文件

FROM browserless/chrome:latest

# browserless/chrome镜像默认进入的是blessuser,没有权限安装
USER root

ENV TZ=Asia/Shanghai
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN apt-get update
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get install tzdata
RUN apt-get clean
RUN apt-get autoclean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 返回到blessuser
USER blessuser

部署文件

version: "3"
services:
  browser-server:
    image: browserless/chrome:latest
    #image: browserless/chrome:tzshanghai
    ports:
      - "3000:3000"
    environment:
      - TZ=Asia/Shanghai
      - MAX_CONCURRENT_SESSIONS=10
      - CONNECTION_TIMEOUT=10000000

当负载很高的情况下,Chrome 启动可能会花上好几秒钟。对大多数情况来说,我们还是希望避免这个启动时间。所以,最好的办法就是预先启动好 Chrome,然后让他在后台等着我们调用。

如果使用 browserless/chrome 这个镜像的话,直接指定 PREBOOT_CHROME=true 就好了。下面的命令会直接启动 10 个浏览器,如果你指定 KEEP_ALIVE,那么在你断开链接(pp.disconnect)的时候也不会关闭浏览器,而只是把相关页面关闭掉。

browserless 的镜像一个核心功能是无缝限制并行和使用队列。也就是说消费程序可以直接使用 puppeteer.connect 而不需要自己实现一个队列。这避免了大量的问题,大部分是太多的 Chrome 实例杀掉了你的应用的可用资源。

$ docker run -e "MAX_CONCURRENT_SESSIONS=10" browserless/chrome

上面限制了并发连接数到10,还可以使用MAX_QUEUE_LENGTH来配置队列的长度。总体来说,每1GB内存可以并行运行10个请求。CPU 有时候会占用过多,但是总的来说瓶颈还是在内存上。

调试控制台

http://localhost:3000/

使用 Puppeteer 连接到 browserless

const puppeteer = require('puppeteer');

(async () => {

    try {
        // browser-server为无头浏览器服务地址
        const browser = await puppeteer.connect({ browserWSEndpoint:'ws://localhost:3000'});
        const page = await browser.newPage();
        await page.goto('https://baidu.com');
        await page.screenshot({
            path: 'x.png',
            type: 'png',
            fullPage: true,
        });

        browser.close()

    } catch (error) {
        console.log(error)
    }

})();

相关文档

https://reposhub.com/linux/shell-package-management/browserless-chrome.html

https://docs.browserless.io/docs/docker.html