Railway部署Puppeteer项目报错:缺失libnss3.so依赖
解决Railway部署Puppeteer时libnss3.so缺失问题
问题背景
本地Windows环境(Node 18.x)运行正常,但将使用Puppeteer的Node.js项目部署到Railway的Linux环境(Node 18.x)时,Chrome启动失败,提示缺少libnss3.so共享库。已尝试添加--no-sandbox参数、降级Node到14.x,问题未解决。
报错信息
/app/indeed-job-scraper/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:241 reject(new Error([ ^ Error: Failed to launch the browser process! /app/indeed-job-scraper/node_modules/puppeteer/.local-chromium/linux-982053/chrome-linux/chrome: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md at onClose (/app/indeed-job-scraper/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:241:20) at Interface.<anonymous> (/app/indeed-job-scraper/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:231:68) at Interface.emit (node:events:525:35) at Interface.close (node:readline:590:8) at Socket.onend (node:readline:280:10) at Socket.emit (node:events:525:35) at endReadableNT (node:internal/streams/readable:1358:12) at processTicksAndRejections (node:internal/process/task_queues:83:21)
当前使用的Puppeteer代码
let puppeteer = require('puppeteer-extra'); let StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); let browser = puppeteer.launch({ headless: true });
解决思路
1. 在Railway中安装Chrome依赖库
Railway支持通过NIXPACKS_INSTALL_CMD环境变量自定义系统依赖安装流程:
- 进入Railway项目的「Variables」设置页面
- 添加环境变量:
上述命令会安装Chrome在Debian/Ubuntu环境运行所需的全部基础依赖,包含缺失的NIXPACKS_INSTALL_CMD=apt-get update && apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libxshmfence1libnss3。
2. 优化Puppeteer启动配置
除--no-sandbox外,补充更适配Linux环境的启动参数,同时启用新版无头模式:
let browser = puppeteer.launch({ headless: 'new', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', // 解决Linux下/dev/shm空间不足问题 '--disable-gpu', // 无GPU环境下禁用硬件加速 '--single-process' // 减少资源占用,适配轻量容器环境 ] });
3. 改用puppeteer-core + 系统级Chrome
若前两种方法无效,可切换为puppeteer-core,直接使用Railway环境中通过apt安装的Chrome:
- 调整依赖包:
npm uninstall puppeteer npm install puppeteer-core - 修改启动代码,指定系统Chrome路径:
let browser = puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-setuid-sandbox'], executablePath: '/usr/bin/google-chrome-stable' }); - 更新环境变量中的安装命令,添加Chrome安装:
NIXPACKS_INSTALL_CMD=apt-get update && apt-get install -y google-chrome-stable libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libxshmfence1
内容的提问来源于stack exchange,提问作者Luke V
相关产品推荐
相关产品推荐

