Heroku服务器运行Puppeteer自动化浏览器启动报错解决方案
问题根因
报错核心原因是Heroku默认运行镜像未预装Puppeteer内置Chromium所需的系统共享库,你日志中提示的libnss3.so: cannot open shared object file就是典型的依赖缺失错误,除此之外Chromium运行还依赖十余个系统库,缺任何一个都会导致浏览器启动失败。
可行解决方案
方案1:使用Puppeteer适配的Heroku构建包(推荐,操作成本最低)
该构建包会在应用构建阶段自动安装全量Chromium运行依赖,无需手动配置包列表:
- 本地安装好Heroku CLI并登录你的账号,进入项目根目录
- 执行命令添加构建包,注意需要将该构建包放在Node.js构建包之前:
heroku buildpacks:add --index 1 jontewks/puppeteer
- 执行
heroku buildpacks确认构建包顺序,确保Node.js相关构建包排在Puppeteer构建包之后 - 提交代码重新触发部署即可
方案2:通过Apt构建包手动安装依赖
如果不想使用第三方维护的Puppeteer构建包,可以用官方apt构建包手动按需安装依赖:
- 添加Heroku官方apt社区构建包:
heroku buildpacks:add --index 1 heroku-community/apt
- 在项目根目录新建名为
Aptfile的无后缀文件,写入以下依赖包名:
libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 libatspi2.0-0 libxshmfence1
- 将
Aptfile提交到代码仓库后重新部署,构建阶段会自动安装列表内的所有系统库
必须配置的Puppeteer启动参数
不管用上述哪种方案,都需要给Puppeteer启动逻辑加Heroku环境必需的运行参数,否则后续可能触发沙箱权限、内存不足类报错,标准启动配置参考:
const browser = await puppeteer.launch({ headless: true, args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu' ] })
注意:--no-sandbox是Heroku容器环境的必填参数,平台默认运行权限不支持Chromium的沙箱隔离机制
依赖校验方法
部署完成后可以执行heroku run bash进入应用运行环境,运行以下命令检查依赖是否全部安装完成:
ldd /app/node_modules/puppeteer/.local-chromium/linux-982053/chrome-linux/chrome | grep "not found"
如果命令执行后无任何输出,说明所有依赖已安装到位,Chromium可以正常启动。
内容的提问来源于stack exchange,提问作者yossi lerer
相关产品推荐
相关产品推荐

