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
相关产品推荐
相关产品推荐

