可以免费进入的网站正能量域名国外包装设计网
可以免费进入的网站正能量域名,国外包装设计网,重庆网站备案公司,短网址生成怎么使用1. 为什么内网离线部署Chrome这么“酸爽”#xff1f;
大家好#xff0c;我是老张#xff0c;在AI和自动化这块折腾了十多年#xff0c;没少跟各种服务器环境打交道。今天想跟大家聊聊一个听起来有点“复古”#xff0c;但在很多企业内网环境里依然绕不开的痛点#xff…1. 为什么内网离线部署Chrome这么“酸爽”大家好我是老张在AI和自动化这块折腾了十多年没少跟各种服务器环境打交道。今天想跟大家聊聊一个听起来有点“复古”但在很多企业内网环境里依然绕不开的痛点在CentOS 7.0这种内网隔离的服务器上离线安装一个完整的Chrome浏览器并且还要能跟Puppeteer这样的自动化工具集成起来用。你可能要问现在都云原生、容器化了谁还折腾这个嘿还真别说我最近就遇到了。客户的生产环境是严格物理隔离的金融内网服务器清一色的CentOS 7.0但他们的一个核心业务系统升级需要用Puppeteer做一批报表的自动化生成和截图。Puppeteer离不开Chrome可内网机器连不上外网yum install google-chrome-stable 这行命令直接就给你摆个“无法解析主机”的脸色看。那场面真是开局一把刀装备全靠“搬”。网上搜一圈教程不少但要么只讲怎么下载几个包缺了关键依赖装不上要么一顿操作猛如虎最后Puppeteer连不上报错让你怀疑人生。我花了差不多两天时间把能找到的国内外帖子都翻了个遍踩了所有的坑终于摸出了一条最稳、最全的路子。今天我就把这条“血泪”总结出来的全攻略分享给你从在外网模拟环境里“一锅端”式下载所有RPM包和依赖到在内网机器上无脑安装最后再到让Puppeteer顺滑地驱动起这个离线Chrome每一步我都会掰开了、揉碎了讲清楚。只要你跟着做哪怕你是刚接触Linux的新手也能搞定这个“堡垒”里的浏览器。简单说我们的核心思路就是“在外网造个一模一样的‘仿品’然后把它的‘全身器官’所有安装包移植到内网”。这个方法的好处是干净、彻底能解决99%的依赖缺失问题而且一次搞定后续同环境机器都能复用。下面我们就开始动手。2. 战前准备打造你的“外网克隆体”工欲善其事必先利其器。我们的第一步是找到一台能通外网的Linux机器把它打造成和内网CentOS 7.0一模一样的“克隆体”。这一步至关重要版本对不上后面下载的包很可能在内网机器上装不了。2.1 确认系统版本的“身份证”首先我们得知道内网CentOS 7.0的具体版本号。CentOS 7.0是一个大版本里面还有更细的次版本号比如7.6.1810、7.9.2009。最稳妥的办法是登录内网机器执行这条命令cat /etc/redhat-release或者用更详细的lsb_release -a如果内网机器没有lsb_release命令用cat /etc/redhat-release肯定没问题。它会返回类似“CentOS Linux release 7.9.2009 (Core)”的信息。记下这个完整的版本号。接下来去外网找一台Linux机器。强烈推荐直接用阿里云、腾讯云等云服务商临时开一台CentOS 7的ECS实例成本很低用几小时就释放非常方便。开实例时在镜像选择里务必选择和你内网机器完全相同的版本号。比如内网是7.9.2009外网也选7.9.2009。如果实在找不到完全一致的确保外网版本小于等于内网版本比如外网用7.6内网是7.9通常向下兼容问题不大但反之则可能出问题。2.2 配置Chrome的“专属供货商”我们的外网克隆体准备好了现在要告诉它我们要从Google官方仓库下载Chrome。CentOS默认的yum源里可没有Chrome所以我们需要手动添加Google的官方源。用你熟悉的编辑器比如vi或nano创建一个新的repo文件vi /etc/yum.repos.d/google-chrome.repo然后把下面这段配置内容贴进去[google-chrome] namegoogle-chrome baseurlhttp://dl.google.com/linux/chrome/rpm/stable/$basearch enabled1 gpgcheck1 gpgkeyhttps://dl-ssl.google.com/linux/linux_signing_key.pub我来解释一下这几个参数是干嘛的[google-chrome]这个源仓库的名字随便起但要有意义。name仓库的描述信息。baseurl最重要的部分指明了下载包的地址。$basearch会自动替换成你系统的架构比如x86_64。enabled1启用这个源。gpgcheck1开启GPG密钥检查确保下载的包是官方发布的没被篡改。gpgkeyGPG公钥的地址用于校验。保存并退出编辑器。接着我们可以更新一下yum缓存让系统识别这个新源yum makecache这一步如果网络通畅应该很快完成。如果遇到速度慢可以暂时不用做不影响后续下载。3. 核心操作打包下载所有“零件”好了仓库有了我们不是要直接安装而是要把Chrome和它所有的“小伙伴”依赖包全部下载到本地。这就需要请出一个神器yum-utils工具包里的yumdownloader。3.1 安装下载神器首先安装这个工具包yum install -y yum-utils这个命令会安装yumdownloader以及其他一些有用的yum工具。3.2 一键下载所有依赖包现在来到最关键的一步。我们使用yumdownloader命令来下载google-chrome-stableChrome稳定版这个软件包以及它运行所需的所有依赖包。yumdownloader --resolve --destdir /root/chrome_packages/ google-chrome-stable让我详细拆解这个命令--resolve这个参数是灵魂它会让yumdownloader自动解析并下载目标软件包的所有依赖关系。没有它你只下载一个chrome主包到内网肯定装不上。--destdir /root/chrome_packages/指定下载的RPM包存放的目录。这里我放在了/root/chrome_packages/下目录不存在会自动创建。你可以改成任何你喜欢的路径。google-chrome-stable我们要下载的软件包名称。执行这个命令后你会看到终端开始刷刷地输出下载信息。这个过程取决于你的网络速度可能会下载几十个甚至上百个RPM包总大小在200MB左右。耐心等待它完成。这里有个我踩过的坑要特别注意有时候一些基础依赖比如glibc、libstdc的版本外网机器可能比内网机器新。yumdownloader默认会下载它认为合适的版本可能是新的。为了避免在内网安装时出现版本冲突我们可以加一个--releasever参数指定下载对应CentOS小版本的包。不过在实践中只要内外网大版本一致并且我们使用--nodeps安装后面会讲这个问题基本可以规避。如果你追求极致稳妥可以这样yumdownloader --resolve --releasever7.9.2009 --destdir /root/chrome_packages/ google-chrome-stable请将7.9.2009替换成你实际的内网版本号下载完成后到/root/chrome_packages/目录下用ls -l | wc -l数一下看看有多少个.rpm文件。数量很多就对了4. 内网安装让Chrome在“堡垒”里安家现在我们外网机器的使命已经完成。将/root/chrome_packages/这个目录整个打包用tar命令或者直接压缩成zip通过U盘、内部文件服务器或者任何你们内网允许的文件传输方式拷贝到目标内网CentOS 7.0机器上。假设你已经把包都放到了内网机器的/root/chrome_packages/目录下。4.1 使用“强力”安装命令进入存放RPM包的目录然后执行我们安装的“王牌命令”cd /root/chrome_packages/ rpm -Uvh *.rpm --nodeps --force这个命令看起来简单但每个参数都很有讲究rpm -Uvh *.rpm-U是升级或安装-v显示详细信息-h用#显示进度条。*.rpm表示安装当前目录下所有的RPM包。--nodeps关键所在。它告诉rpm安装时不检查依赖关系。为什么我们明明下载了所有依赖还要忽略检查因为有些依赖关系树非常复杂或者存在循环依赖在离线环境下严格检查很容易卡住。我们已经把可能需要的包都下载齐了所以可以大胆跳过检查让rpm先把所有文件都装到系统里。--force另一个关键。强制安装覆盖任何已有的文件或旧版本。这能解决包冲突的问题。执行这条命令后屏幕上会飞速滚动安装信息。只要没有出现明显的、红色的错误提示一些“警告”信息可以忽略就说明安装过程在顺利进行。4.2 验证安装是否成功安装完成后我们来验证一下Chrome是否真的装好了。在终端输入google-chrome --version或者google-chrome-stable --version如果安装成功你会看到类似“Google Chrome 114.0.5735.198”这样的版本号输出。恭喜你最艰难的一步已经跨过去了Chrome浏览器已经在你内网的CentOS上安家了。但是先别急着高兴。我们的目标是让Puppeteer能用而Puppeteer通常需要以无头模式启动Chrome。我们直接试一下这个关键命令google-chrome --no-sandbox --headless --disable-gpu --remote-debugging-port9222 --dump-dom https://www.example.com解释一下这些参数--no-sandbox在服务器环境下尤其是以root用户运行时通常必须添加这个参数来禁用沙盒否则Chrome会崩溃。这是Puppeteer集成时最常见的坑。--headless无头模式没有图形界面。--disable-gpu在无头模式下禁用GPU加速避免一些不必要的麻烦。--remote-debugging-port9222开启远程调试端口这是Puppeteer连接Chrome的桥梁。--dump-dom https://www.example.com一个测试命令让无头Chrome访问一个网址并输出其DOM内容。如果这个命令能执行并输出了一大堆HTML代码那么说明你的离线Chrome不仅装好了而且已经具备了被Puppeteer调用的基础能力。如果报错最常见的是缺少某些库文件我们接下来就解决。5. 查漏补缺解决那些“阴魂不散”的依赖问题即便用了--nodeps和--force有时安装后直接运行Chrome可能还是会报错提示缺少某个.so库文件比如libatk-bridge-2.0.so.0。这是因为有些动态库的依赖关系在安装时没有正确建立链接或者我们下载的包集合里确实漏掉了一两个非常隐蔽的依赖。5.1 使用ldd进行依赖诊断遇到“找不到共享库”的错误时别慌。我们可以用ldd命令来诊断Chrome二进制文件到底缺什么。首先找到Chrome的可执行文件路径通常在/opt/google/chrome/下ldd /opt/google/chrome/chrome | grep not found这条命令会列出所有chrome程序依赖但当前系统找不到的动态链接库。记下这些库的名字比如libpangocairo-1.0.so.0。5.2 在外网机器上“按图索骥”针对每一个“not found”的库我们需要回到那台外网克隆体机器上找到是哪个RPM包提供了这个库文件。这里有个超级好用的命令yum providesyum provides */libpangocairo-1.0.so.0把libpangocairo-1.0.so.0替换成你实际缺失的库名。这个命令会搜索所有仓库告诉你哪个软件包包含这个文件。例如它可能会返回“pango-1.42.4-4.el7_7.x86_64”。然后我们再次使用yumdownloader单独下载这个缺失的包到我们的打包目录cd /root/chrome_packages/ yumdownloader --destdir ./ pango下载后同样将这个新增的RPM包拷贝到内网机器并再次运行rpm -Uvh pango*.rpm --nodeps --force。5.3 建立软链接最后一招有时候库文件其实已经安装了但放在了非标准路径或者版本号链接不对。这时可以手动建立软链接。比如发现libfoo.so.1找不到但用find / -name libfoo*发现它存在于/usr/local/lib/下我们可以ln -s /usr/local/lib/libfoo.so.1.2.3 /usr/lib64/libfoo.so.1注意操作系统的库目录如/usr/lib64要谨慎处理。最好先确认这个库确实不是通过RPM包安装的以免破坏包管理系统。通过以上“诊断-搜索-下载-安装”的循环基本上可以扫清所有依赖障碍。我自己的经验是主要缺失的包多与图形界面相关比如pango、cairo、libXcomposite等因为Chrome即使无头运行也需要这些库来处理字体和基本的图形渲染。6. 与Puppeteer集成让自动化脚本跑起来Chrome准备就绪现在轮到Puppeteer上场了。Puppeteer是一个Node.js库我们需要在内网机器上部署Node.js环境和Puppeteer。6.1 离线安装Node.js和Puppeteer内网机器同样无法直接从npm官方源安装。我们可以采用和外网下载Chrome类似的思路在外网机器上使用yumdownloader下载Node.js的RPM包及其依赖或者直接去Node.js官网下载编译好的Linux二进制包node-vxx.x.x-linux-x64.tar.xz后者更简单。将Node.js二进制包拷贝到内网解压到/usr/local/目录并配置好环境变量。在外网能通npm的机器上创建一个空项目安装Puppeteernpm init -y npm install puppeteer。安装完成后将整个node_modules目录打包。特别注意Puppeteer默认会下载一个Chrome但这个我们是用不上的可以安装时指定跳过npm install puppeteer --ignore-scripts或者安装后直接删除node_modules/puppeteer/.local-chrome。将打包的node_modules和package.json拷贝到内网机器的项目目录。6.2 编写Puppeteer启动脚本在内网机器你的项目目录下创建一个测试脚本比如test.jsconst puppeteer require(puppeteer); (async () { // 关键在这里指定我们离线安装的Chrome可执行文件路径 const browser await puppeteer.launch({ executablePath: /opt/google/chrome/chrome, args: [ --no-sandbox, --headless, --disable-gpu, --disable-dev-shm-usage, // 这个参数在Docker和某些低内存环境很有用内网服务器也可以加上 --remote-debugging-port9222 ] }); const page await browser.newPage(); await page.goto(https://www.example.com); console.log(await page.title()); // 截个图看看效果 await page.screenshot({path: example.png}); console.log(截图已保存为 example.png); await browser.close(); })();这个脚本的核心是executablePath参数它显式地告诉Puppeteer“别用你自带的那个Chrome用我指定路径的这个。” 这正是我们离线部署Chrome的价值所在。6.3 运行与调试运行你的脚本node test.js如果一切顺利你会看到输出了网页标题并且生成了example.png截图文件。如果遇到错误请仔细查看错误信息。最常见的还是Chrome启动失败请回头检查executablePath路径是否正确。Chrome是否真的能通过命令行以无头模式启动参考第4.2节的测试命令。是否遗漏了某个动态库参考第5节的方法诊断。7. 进阶优化与避坑指南走到这一步基本功能已经实现了。但想在生产环境跑得稳还有一些细节可以优化以及一些深坑需要避开。7.1 处理字体缺失问题在无头模式下截图或生成PDF中文显示为方框这是因为服务器缺少中文字体。我们需要安装字体包同样采用离线RPM的方式。常用的字体包有fontconfig字体配置工具。dejavu-sans-fonts一种等宽字体。wqy-microhei-fonts或wqy-zenhei-fonts文泉驿微米黑/正黑开源的中文字体。在外网机器上用yumdownloader下载这些字体包然后在内网安装。安装后可以运行fc-cache -fv更新字体缓存。7.2 内存与进程管理Puppeteer打开的每个浏览器实例都会消耗不少内存。在长期运行的服务中一定要做好资源管理在脚本中确保browser.close()被调用使用try...catch...finally。考虑使用puppeteer.connect()连接到已存在的浏览器实例而不是每次都launch()一个新的。监控服务器内存必要时重启服务或清理僵尸进程。可以用pkill chrome来强制结束所有Chrome进程。7.3 构建可移植的离线包如果你需要给多台同环境的内网机器部署可以把我们整个过程中收集到的东西打包成一个完整的离线安装包/root/chrome_packages/目录下的所有RPM包。Node.js二进制包。包含Puppeteer的node_modules。一个安装脚本install.sh自动执行rpm -Uvh、解压Node.js、配置环境变量等。这样在任何一台新的内网CentOS 7.0机器上只需要拷贝这个包运行一个脚本就能获得一个完整的、可被Puppeteer调用的Chrome环境。这大大提升了部署效率也是我最终在客户现场采用的方案。整个过程虽然前期准备繁琐但一次构建处处运行对于严格的内网环境来说这种投入是非常值得的。