Puppeteer代码本地正常,AWS EC2实例报导航超时错误
问题排查:EC2上Puppeteer截图超时的原因与解决方法
可能的原因及对应解决方法
1. EC2实例缺少Puppeteer运行的系统依赖
Puppeteer依赖Chrome浏览器的底层库,本地系统通常自带这些依赖,但EC2的服务器系统(如Amazon Linux 2、Ubuntu)默认没有安装,这会导致Chrome无法正常启动,最终引发导航超时。
解决方法:
根据你的EC2系统类型执行以下命令安装依赖:
- 对于Amazon Linux 2:
sudo yum install -y alsa-lib.x86_64 atk.x86_64 cups-libs.x86_64 gtk3.x86_64 ipa-gothic-fonts libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXrandr.x86_64 libXScrnSaver.x86_64 libXtst.x86_64 pango.x86_64 xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc
- 对于Ubuntu/Debian:
sudo apt-get update sudo apt-get install -y libnss3-dev libatk-bridge2.0-dev libcups2-dev libxkbcommon-dev libgtk-3-dev libasound2-dev
2. Puppeteer启动参数未适配无头服务器环境
本地运行有桌面环境支持浏览器渲染,但EC2是无头服务器,默认启动参数无法正常初始化Chrome进程,导致页面导航停滞超时。
解决方法:
修改Puppeteer启动配置,添加适配无头环境的参数:
const browser = await puppeteer.launch({ headless: 'new', // 使用新版无头模式,兼容性更接近真实浏览器 args: [ '--no-sandbox', // 无root权限时必需,禁用沙箱机制 '--disable-setuid-sandbox', '--disable-dev-shm-usage', // 解决EC2共享内存不足的问题 '--disable-gpu', // 无头环境无需GPU加速 '--window-size=1920,1080' // 设置窗口尺寸,确保页面渲染完整 ] });
3. 目标网站的反爬机制拦截EC2请求
目标网站可能检测到EC2的IP段、无头浏览器特征,拒绝响应或故意延迟返回,最终触发导航超时。
解决方法:
- 模拟真实浏览器的User-Agent:
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
- 延长导航超时时间并调整等待策略:
await page.goto('https://xxxxxxx.xxx.xxx.xx/xxxxx-xxxxx', { timeout: 60000, // 超时时间延长至60秒 waitUntil: 'networkidle2' // 等待网络请求基本完成后再继续执行 });
- 验证IP是否被拦截:在EC2终端执行
curl -v https://xxxxxxx.xxx.xxx.xx/xxxxx-xxxxx,如果curl也超时,说明IP被目标网站拦截,可尝试重启EC2实例更换公网IP,或使用代理IP访问。
4. 网络DNS解析异常
如果目标地址是域名而非IP,EC2实例可能无法正确解析域名,导致导航请求无法送达目标服务器。
解决方法:
在EC2终端执行nslookup your-target-domain.com检查解析结果,若解析失败,可手动将EC2的DNS服务器改为公共DNS(如8.8.8.8)。
内容的提问来源于stack exchange,提问作者Anudeep GI
相关产品推荐
相关产品推荐

