镜像文件
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