You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer本地运行正常,部署到Ubuntu服务器后无法完成截图

问题分析与解决方案

你的问题核心是:本地运行正常的Puppeteer截图脚本,部署到Ubuntu服务器后,仅输出Launching browser...就无后续日志,返回值为0但未完成截图流程。以下是针对性的排查和解决步骤:


1. 补充Puppeteer依赖的浏览器组件

Ubuntu服务器默认缺少Chromium/Chrome运行所需的系统依赖,即使使用--no-sandbox参数也无法启动浏览器。执行以下命令安装必要库:

sudo apt-get update
sudo apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libgtk-3-0

也可以直接让Puppeteer自动安装适配的浏览器版本:

cd /var/www/sitechecker
npx puppeteer browsers install chrome

2. 验证执行用户权限

Laravel通常以www-data用户运行,需确保该用户有足够权限执行脚本和写入文件:

  • 修复storage目录权限:
sudo chown -R www-data:www-data /var/www/sitechecker/storage
  • 手动用www-data用户执行脚本,直接查看终端错误:
sudo -u www-data node /var/www/sitechecker/node_scripts/screenshot.js 'https://github.com/' /tmp/test.png

3. 捕获脚本的错误输出

当前Laravel的exec仅捕获stdout,脚本的错误信息(如浏览器启动失败)会输出到stderr,导致日志缺失。修改Laravel代码,将stderr重定向到stdout:

$command = "node $scriptPath $escapedUrl $storagePath 2>&1";
Log::info("Executing command: $command");

exec($command, $output, $returnvar);
Log::info("Return Value: $returnvar");
Log::info($output);

这样就能在日志中看到脚本执行的具体错误信息,定位问题根源。

4. 调整Puppeteer启动参数

针对Ubuntu服务器环境,添加更适配的无头模式参数,避免启动卡住:

const browser = await puppeteer.launch({
    args: [
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--disable-dev-shm-usage", // 解决/dev/shm空间不足问题
        "--disable-gpu",
        "--no-zygote",
        "--single-process"
    ],
    headless: "new" // 使用新版无头模式,稳定性更高
});

5. 确保Node与Puppeteer版本兼容

不同版本的Puppeteer对Node版本有要求,重新安装适配的Puppeteer版本:

cd /var/www/sitechecker
npm uninstall puppeteer
npm install puppeteer --save

安装过程会自动下载与当前Node版本匹配的Chromium,避免版本不兼容导致的启动失败。


内容的提问来源于stack exchange,提问作者azurine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:27:07