Heroku平台Flask应用使用pyppeteer时Chrome浏览器意外关闭如何解决
解决方案
- 调整pyppeteer启动参数
Heroku的容器环境属于无特权受限环境,Chrome默认的沙箱机制无法运行,且pyppeteer默认会调用自带的Chromium,和你安装的Chrome buildpack不匹配,需要显式指定启动参数和Chrome执行路径,示例代码如下:
from pyppeteer import launch browser = await launch( headless=True, args=[ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu', '--no-zygote' ], # Heroku上google-chrome buildpack的固定安装路径 executablePath='/opt/google/chrome/google-chrome', # 关闭自动下载Chromium的逻辑,避免使用自带的不兼容版本 autoClose=False )
注意:操作完页面逻辑后要主动调用
browser.close()释放资源,避免内存占用过高被Heroku系统kill。
- 调整buildpack的安装顺序与依赖
添加buildpack时需要保证系统级依赖的优先级高于语言级依赖,正确的顺序应该是先安装Chrome、ChromeDriver相关buildpack,再安装Python buildpack。
执行以下命令校验顺序:heroku buildpacks
正常输出顺序应为:
- heroku/google-chrome
- heroku/chromedriver
- heroku/python
如果缺少chromedriver依赖,执行heroku buildpacks:add heroku/chromedriver添加;如果顺序错误,执行heroku buildpacks:add --index 1 heroku/google-chrome调整优先级。
排查版本兼容性问题
部分高版本pyppeteer和Heroku预装的Chrome版本存在兼容性问题,可以在requirements.txt中锁定兼容性更好的版本:pyppeteer==0.2.5
重新部署后验证问题是否解决。排查资源占用问题
Heroku免费dyno的内存上限为512MB,Chrome启动后内存占用较高,如果超出上限会被系统强制杀死。可以在启动参数中添加--max-old-space-size=256限制Chrome的内存占用,或是升级到更高配置的dyno。
内容的提问来源于stack exchange,提问作者racheal_surprise
相关产品推荐
相关产品推荐

