Ubuntu EC2中Laravel调用Puppeteer无法找到Chrome的问题
解决Laravel Process调用Puppeteer找不到Chrome的问题
针对你在EC2 Ubuntu 22.04环境遇到的问题,核心原因是Laravel Process的运行环境(用户、环境变量)与直接执行node脚本时不一致,以下是具体解决步骤:
1. 显式指定Chrome路径(最直接的解决方案)
在你的Puppeteer脚本中,直接指定Chrome的可执行文件路径,跳过自动检测逻辑:
const puppeteer = require('puppeteer'); (async () => { // 硬编码Chrome路径,确保Puppeteer能准确定位 const browser = await puppeteer.launch({ executablePath: '/home/ubuntu/.cache/puppeteer/chrome/linux-125.0.6422.78/chrome-linux64/chrome', // EC2环境需要添加沙箱禁用参数,避免权限问题 args: ['--no-sandbox', '--disable-setuid-sandbox'] }); // 你的业务逻辑代码 const page = await browser.newPage(); await page.goto('https://example.com'); // ...其他操作 await browser.close(); })();
2. 调整Laravel Process的运行环境
直接执行node脚本时用的是ubuntu用户,但Laravel通常以www-data用户运行(Nginx/Apache默认配置),导致Puppeteer无法访问ubuntu用户缓存目录下的Chrome。可以通过以下两种方式解决:
方式A:设置HOME环境变量
在Laravel调用Process时,强制指定HOME为ubuntu用户的目录,让Puppeteer读取正确的缓存路径:
use Illuminate\Support\Facades\Process; $process = Process::path('/path/to/your/node/script') ->env(['HOME' => '/home/ubuntu']) ->run('node puppetter-test.js'); // 查看执行结果 dd($process->output(), $process->errorOutput());
方式B:修改Chrome目录权限
让www-data用户能访问Chrome所在的缓存目录:
# 赋予目录读执行权限 sudo chmod -R 755 /home/ubuntu/.cache/puppeteer/chrome/linux-125.0.6422.78/chrome-linux64 # 更改目录所属用户为www-data sudo chown -R www-data:www-data /home/ubuntu/.cache/puppeteer
3. 检查并安装Chrome依赖库
Ubuntu环境下运行Chrome可能缺少必要的系统依赖,即使直接执行脚本没问题,Laravel的运行环境可能未加载这些依赖,执行以下命令安装:
sudo apt-get update && sudo apt-get install -y libnss3-dev libatk-bridge2.0-0 libdrm-dev libxkbcommon-dev libgbm-dev libasound-dev libatspi2.0-0 libxshmfence-dev
4. 调试运行环境确认问题
如果以上方法仍未解决,可以先排查Laravel Process的运行用户和环境变量:
use Illuminate\Support\Facades\Process; // 执行命令查看当前用户和HOME路径 $result = Process::run('whoami && echo $HOME && ls -la /home/ubuntu/.cache/puppeteer/chrome/linux-125.0.6422.78/chrome-linux64'); dd($result->output(), $result->errorOutput());
根据输出结果,可以明确是用户权限问题还是路径访问问题,再针对性调整。
内容的提问来源于stack exchange,提问作者DontVoteMeDown
相关产品推荐
相关产品推荐

