如何在无GUI的Ubuntu Server上运行Chrome headful模式?
在无GUI Ubuntu Server上用Puppeteer以Headful模式运行Chrome的解决方案
可行性说明
完全可以实现你的需求——在无GUI的Ubuntu Server上以headful模式运行Chrome配合Puppeteer,核心是通过虚拟显示服务模拟图形环境,同时避开权限和GPU相关的坑。
问题分析
你遇到的错误主要来自三个方面:
- Snap版Chromium的AppArmor权限限制,导致DBus调用失败
- 虚拟环境下的GPU渲染问题,Chrome无法找到合适的图形配置
- 以root用户运行带来的权限冲突
分步解决方案
1. 替换为官方Google Chrome(推荐)
Snap版Chromium有严格的沙箱限制,换成官方Chrome能减少大部分权限问题:
# 下载Chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb # 安装依赖并安装Chrome sudo apt install -y ./google-chrome-stable_current_amd64.deb
2. 使用xvfb-run简化虚拟显示配置
手动启动Xvfb容易遗漏配置,xvfb-run会自动处理虚拟显示的创建和环境变量设置:
# 先安装xvfb sudo apt install -y xvfb
3. 调整Puppeteer代码配置
在你的Node.js代码里,指定Chrome路径并添加必要的启动参数,禁用GPU和沙箱(无GUI环境下不需要):
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ // 指定官方Chrome的路径 executablePath: '/usr/bin/google-chrome-stable', // 启用headful模式 headless: false, // 禁用GPU渲染,避免图形配置错误 args: [ '--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage', '--disable-software-rasterizer', '--window-size=1280,1024' ], // 传递虚拟显示的环境变量 env: { ...process.env, DISPLAY: process.env.DISPLAY || ':99' } }); // 后续你的业务代码 const page = await browser.newPage(); await page.goto('https://example.com'); // ... await browser.close(); })();
4. 用普通用户运行程序(避免root权限问题)
以root用户运行Chrome会触发更多权限限制,创建一个普通用户来运行你的应用:
# 创建普通用户 sudo useradd -m puppeteer-user # 切换到该用户 su - puppeteer-user
然后在这个用户环境下安装依赖、运行你的Node.js应用。
5. 一键运行命令
用xvfb-run直接启动你的Node.js应用,它会自动创建虚拟显示:
xvfb-run -a node your-app.js
-a参数会自动找可用的显示端口,不用手动指定:99。
验证方法
如果想确认Chrome是否真的在headful模式运行,可以截图验证:
在代码里添加截图代码:
await page.screenshot({ path: 'page-screenshot.png' });
运行后查看生成的截图,能看到完整的页面内容就说明headful模式生效了。
内容的提问来源于stack exchange,提问作者Lorik
相关产品推荐
相关产品推荐

