如何让Puppeteer/Playwright在Azure Linux Web App Service正常运行
Puppeteer部署到Azure Linux Web App Service故障排查
故障背景
- 基于Puppeteer开发的网页转PDF功能,本地环境可完全正常运行
- 部署到Azure Linux Web App Service后出现运行报错
- 核心实现代码如下:
const puppeteer = require("puppeteer"); const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto( `https://${env.domain}/authorize? client_id=${env.clientId}&response_type=token&redirect_uri=${env.redirectUri}`, { waitUntil: "networkidle2" } ); await page.waitForSelector('input[name="email"]', { visible: true, timeout: 5000 }); await page.type('input[name="email"]', env.email, {delay: 50}); await page.type('input[name="password"]', env.password, {delay: 50}); await page.click('button[type="submit"]'); await page.waitForNavigation({ waitUntil: "networkidle2" }); const clientUrl = await page.evaluate(() => window.location.href); await page.pdf({path: 'sendgrid/html-page.pdf', format: 'A4'}); await browser.close();
报错信息
- 报错1:
找不到版本为818858的浏览器,请运行
PUPPETEER_PRODUCT=firefox npm install或PUPPETEER_PRODUCT=firefox yarn install下载受支持的Firefox浏览器二进制文件
- 报错2:
/node_modules/puppeteer/.local-chromium/linux-782078/chrome-linux/chrome加载共享库时出错:libgobject-2.0.so.0:无法打开共享对象文件:没有该文件或目录
修复方案
1. 解决浏览器二进制找不到问题
- 跳过Puppeteer自带Chromium下载,使用Azure官方预装的浏览器
在项目根目录的package.json中添加配置,或在部署时设置环境变量PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true:"puppeteer": { "skip_chromium_download": true } - 调整Puppeteer启动参数,指定系统预装Chromium路径,补充容器运行必需的安全参数:
const browser = await puppeteer.launch({ executablePath: '/usr/bin/chromium-browser', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage' ] });
2. 解决系统共享库缺失问题
- 优先使用Azure官方提供的Node.js Linux Web App镜像,该镜像已预装所有无头浏览器运行所需的系统依赖,无需额外安装。
- 若使用自定义容器,在Dockerfile构建阶段安装全部必需依赖:
apt-get update && apt-get install -y \ libglib2.0-0 \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libasound2
3. 稳定运行优化配置
- 替换
networkidle2等待策略:Azure Web App网络环境存在持续后台请求,易导致超时,改为domcontentloaded后搭配固定元素等待逻辑。 - 调整PDF输出路径:Azure Linux Web App仅
/home目录下可读写,将PDF输出路径改为绝对路径:await page.pdf({path: '/home/sendgrid/html-page.pdf', format: 'A4'}); - 限制浏览器内存占用,在启动参数中添加
--js-flags="--max-old-space-size=4096",避免内存溢出崩溃。
内容的提问来源于stack exchange,提问作者vignesh ramesh
相关产品推荐
相关产品推荐

