部署

Ubuntu Headless 浏览器设置:完整服务器指南

如何在 Ubuntu 上设置 headless 浏览器自动化,包括 Xvfb、系统依赖、systemd 服务和生产配置。

文档中心

想直接看维护中的产品文档?

这篇文章对应的主题已经有文档中心页面。需要规范流程、当前参数和长期参考时,优先看 docs。

生产基准

在 headless Ubuntu 服务器上运行 BotBrowser 是大多数生产部署的基础。服务器没有物理显示器,GPU 驱动与桌面系统不同,BotBrowser 依赖的部分系统库在最小化服务器镜像上默认未安装。正确处理这些细节是稳定生产环境与间歇性崩溃之间的区别。

本文介绍系统依赖、按工作负载选择 Xvfb(X 虚拟帧缓冲)、使用 systemd 监督服务,以及通过 Playwright 或 Puppeteer 运行 BotBrowser。

为什么 Headless 服务器设置很重要

桌面环境会处理显示管理、图形初始化和字体渲染。最小化的 Ubuntu Server 安装可能缺少浏览器所需的共享库和字体包。只有选用 X11 图形路径的工作负载才需要显示服务器。

设置不完整时,可能出现 "cannot open display"、空白截图、缺字或媒体播放不稳定等现象。应把这些现象视为发布阻断问题,并在投入生产前修正宿主配置。

DISPLAY 只在部署选择 Xvfb 或其他 X11 显示服务时设置。原生 headless 路径不需要为了启动浏览器而强制配置 Xvfb。请使用目标页面、图形后端和媒体流程验证所选方案。

显示与系统要求

Xvfb(X 虚拟帧缓冲)

Xvfb 提供一个虚拟显示服务器,实现 X11 协议而不需要物理显示硬件。BotBrowser 连接到 Xvfb 后,可以正常完成图形初始化。

关键配置参数:

  • 显示号:10):任意标识符。使用 :10 避免与桌面安装可能使用的 :0 冲突。
  • 屏幕规格1920x1080x24):宽度、高度和颜色深度。24 位颜色深度对于准确渲染是必需的。
  • DISPLAY 环境变量DISPLAY=:10.0):使用 Xvfb 时,为启动浏览器的服务和脚本设置同一显示号。

浏览器系统依赖

BotBrowser 使用用于渲染、音频、网络和辅助功能的共享库。桌面 Ubuntu 通常已经包含大部分依赖,最小服务器镜像则需要明确安装。

关键类别:

  • 图形libdrm2, libgbm1, libxcomposite1, libxdamage1, libxrandr2 用于显示合成
  • UI 工具包libgtk-3-0, libatk-bridge2.0-0, libatk1.0-0 用于辅助功能和部件渲染
  • 安全libnss3, libnspr4 用于 TLS 和证书处理
  • 音频libasound2 用于音频子系统初始化(即使不播放音频)
  • 字体fonts-liberation 用于基本字体可用性
  • 桌面集成xdg-utils 用于 MIME 类型处理

<svg viewBox="0 0 700 300" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="headless-zh-title headless-zh-desc" style={{maxWidth: '100%', height: 'auto'}}>

无界面服务器部署 BotBrowser 配合虚拟显示服务和所需 Linux 系统库运行。 Headless 服务器架构 BotBrowser BotBrowser + 配置文件 Headless 模式 Xvfb :10 虚拟显示 1920x1080x24 系统库 GTK, NSS, GBM 字体、音频 Ubuntu 22.04 LTS (Headless) 环境中设置 DISPLAY=:10.0

常见设置问题

不使用 Xvfb 运行

原生 headless 可以在不启动 Xvfb 的情况下运行。Xvfb 适用于依赖 X11、需要虚拟显示器或已按该路径验证的工作负载。两种方式都应在目标 Linux 图形后端上完成页面、媒体和截图验证,再选定生产配置。

缺少字体包

Ubuntu Server 只提供基础字体支持。安装文档要求的字体包,再用代表性页面检查缺字、标签裁切、换行和文档分页。把批准后的包集合固定在服务器镜像中。

不正确的显示深度

如果选择 Xvfb,请使用经过验证的显示尺寸和色深。示例采用 24 位色深,实际值应与部署基线一致。

以 Root 身份运行且未设置沙箱标志

BotBrowser 的沙箱需要特定的内核能力。在 Docker 容器中或以 root 身份运行时,沙箱可能无法正常启动。在这些环境中应按照部署文档配置所需权限。

发布行为

BotBrowser 支持无界面服务器部署。配置文件协调平台、字体和图形行为,服务器仍需提供与目标工作负载兼容的系统库和图形后端。请在生产所用主机上验证页面渲染、媒体和截图,不要假设不同主机配置会自动产生相同结果。

Xvfb 是可选图形路径。只有采用 X11 虚拟显示方案时才需要运行显示服务器并设置 DISPLAY

BotBrowser 150.0.7871.46 在无界面模式下不会打开可见的配置提示窗口。缺少、无效、过期或版本不匹配的配置状态会写入终端输出,随后浏览器按启动失败路径退出。桌面有界面启动仍保留面向用户的图形提示。

这对 systemd、容器编排和工作节点管理更清楚。健康检查应同时观察进程退出状态、终端日志和获准任务结果,不应等待服务器上不会出现的窗口。配置文件包必须与 BotBrowser 主版本匹配,并在创建第一个页面前完成验证。

容器日志中可能出现与桌面服务或图形服务有关的提示。判断部署是否健康时,应确认会话能够创建、获准任务能够完成,并且选定的图形后端与系统库可用。资源紧张时,应先降低新任务接收速度并检查宿主压力。

安装与启动

步骤 1: 安装系统依赖

sudo apt-get update && sudo apt-get install -y \
  wget ca-certificates fonts-liberation \
  libasound2 libatk-bridge2.0-0 libatk1.0-0 \
  libcups2 libdbus-1-3 libdrm2 libgbm1 \
  libgtk-3-0 libnspr4 libnss3 \
  libxcomposite1 libxdamage1 libxrandr2 \
  xdg-utils xvfb

对于 Ubuntu 24.04,某些包名称已更改:

sudo apt-get install -y \
  libasound2t64 libatk-bridge2.0-0 libatk1.0-0 \
  libcups2t64 libgbm1 libgtk-3-0t64 \
  libnss3 libxcomposite1 libxdamage1 \
  libxrandr2 xvfb fonts-liberation xdg-utils

步骤 2:按需启动 Xvfb

用于即时测试:

Xvfb :10 -screen 0 1920x1080x24 &
export DISPLAY=:10.0

生产环境创建 systemd 服务:

# /etc/systemd/system/xvfb.service
[Unit]
Description=X Virtual Frame Buffer
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/Xvfb :10 -screen 0 1920x1080x24
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable xvfb
sudo systemctl start xvfb

步骤 3: 安装 BotBrowser

# 把占位符替换成发布页面中匹配的 Linux 资源
curl -fL -o botbrowser.tar.gz \
  "https://github.com/botswin/BotBrowser/releases/download/<release-tag>/<linux-archive>"

# 解压到 /opt
sudo mkdir -p /opt/botbrowser
sudo tar -xzf botbrowser.tar.gz -C /opt/botbrowser/
sudo chmod +x /opt/botbrowser/chrome

# 验证安装
DISPLAY=:10.0 /opt/botbrowser/chrome --version

步骤 4: 下载配置文件

sudo mkdir -p /opt/botbrowser/profiles
sudo install -m 600 /path/to/<matching-profile>.enc \
  /opt/botbrowser/profiles/profile.enc

步骤 5: 测试启动

使用步骤 6 的最小 Playwright 任务检查完整启动路径。以生产环境计划使用的服务账号、配置文件包、工作目录和图形路径运行。只有 Xvfb 配置才添加 DISPLAY=:10.0。检查应打开获准页面、完成一个小型应用动作并正常关闭。

步骤 6: Playwright 集成

npm install playwright-core
const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/opt/botbrowser/chrome',
    args: [
      '--disable-setuid-sandbox',
      '--bot-profile=/opt/botbrowser/profiles/profile.enc',
      '--proxy-server=socks5://user:pass@proxy.example.com:1080',
    ],
    headless: true,
  });

  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://example.com');
  console.log('Title:', await page.title());
  await browser.close();
})();

使用 display 变量运行:

DISPLAY=:10.0 node script.js

步骤 7: 用于自动化的 systemd 服务

# /etc/systemd/system/botbrowser-worker.service
[Unit]
Description=BotBrowser Automation Worker
After=xvfb.service
Requires=xvfb.service

[Service]
Type=simple
Environment=DISPLAY=:10.0
WorkingDirectory=/opt/scripts
ExecStart=/usr/bin/node /opt/scripts/worker.js
Restart=always
RestartSec=10
User=botbrowser
Group=botbrowser

[Install]
WantedBy=multi-user.target

每个服务管理一个工作负载

每个服务单元只负责一个明确的工作负载和一个数据目录。应用负责浏览器的启动与关闭,使监督程序能够获得清晰的进程状态。日志、资源限制和重启策略也能准确归属到对应工作负载。

发布周期、图形要求或安全边界不同的应用,应使用独立服务。不要用 shell 循环启动多个配置文件。循环会掩盖具体失败任务,并可能在父进程退出后留下子进程。

把恢复策略交给服务管理器。设置重试间隔和启动次数限制,避免无效配置文件或损坏镜像形成持续重启。配置修复前,失败状态应对监控保持可见。

验证

完成设置后验证一切正常:

# 检查 Xvfb 是否运行
systemctl status xvfb

# 检查显示是否可访问
DISPLAY=:10.0 xdpyinfo | head -5

# 检查 BotBrowser 依赖是否满足
ldd /opt/botbrowser/chrome | grep "not found"

# 启动并验证页面导航
DISPLAY=:10.0 node -e "
const { chromium } = require('playwright-core');
(async () => {
  const b = await chromium.launch({
    executablePath: '/opt/botbrowser/chrome',
    args: ['--bot-profile=/opt/botbrowser/profiles/profile.enc'],
    headless: true,
  });
  const p = await (await b.newContext()).newPage();
  await p.goto('https://example.com');
  console.log('Navigation completed:', await p.title());
  await b.close();
})();
"

浏览器应能打开代表性页面、完成导航并正常退出。把终端输出和退出状态保存在部署日志中。

服务就绪与健康检查

就绪状态应来自工作负载结果,而不只是浏览器进程存在。有效的启动检查需要确认服务接受配置、建立会话、打开获准页面并完成一个小型应用动作。任一步骤失败时都应尽快结束。

健康检查要与客户流量分开。使用专用测试账号或不含个人数据的公开页面。结果只需说明应用能否启动、导航和正常关闭。

启动就绪与持续健康是两类判断。持续健康还要关注队列进展、最近任务完成情况、退出状态、磁盘空间、内存压力,以及需要时的显示服务状态。进程仍在运行,并不代表应用仍在推进任务。

检查时限应参考正常工作负载。重复超时应视为服务失败,并保留最后完成步骤。检查频率不能过高,以免与生产任务争用资源或反复启动完整会话。

检查失败后,先停止向工作节点分配新任务,再执行重启。记录中断任务,停止服务,并把数据目录恢复到已批准状态。重试不应继续使用可能损坏的数据。

日志与失败恢复

把应用输出和浏览器终端输出发送到平台的标准日志位置。记录服务版本、BotBrowser 版本、配置文件包、服务器镜像和任务标识。不要记录页面内容、凭据、代理密钥或客户数据。

在日志和诊断产物耗尽磁盘前进行轮换。保留足以比较候选版本与上一批准版本的历史,再遵循组织现有的保留与隐私政策。

按所需行动给失败分类。配置失败需要修正服务或配置文件。依赖失败需要修复服务器镜像。资源失败需要重新评估工作负载或容量。应用失败由应用负责人处理。

在预发布环境验证恢复。可以在授权测试任务中停止服务、重启宿主,并临时让必要依赖不可用。确认监控报告正确服务,监督程序遵守重启限制,下一任务从批准状态开始。

服务器镜像变更控制

把操作系统镜像、浏览器版本、配置文件包、服务单元和应用作为一个部署组合记录。任何一层变化都可能影响启动、渲染、媒体或资源使用。

系统更新要经过与应用更新相同的预发布路径。语言包、图形库、容器运行环境和安全策略变化,都应运行代表性浏览器任务。

每次推广少量变化。保留上一批准组合,并记录回退顺序。回退应恢复完整组合,不能把旧浏览器与未经复核的配置文件或服务文件混用。

推广后观察任务完成、重启频率、磁盘增长和资源压力。候选镜像即使能够启动,如果在正常工作中持续退化,也应先退出工作节点池再继续排查。

Headless 启动与配置文件验证

Headless 模式通过终端输出报告配置文件缺失、过期、无效或版本不匹配等启动状态,不会打开桌面提示窗口。自动化平台应把这些消息视为启动失败,并在重试前修正配置文件包。

容器日志也可能包含桌面或图形服务提示。应根据会话创建、获准任务结果和所选图形路径判断就绪状态,并确保宿主库与配置文件包符合当前部署记录。

运行规则

按图形路径设置 DISPLAY 只有使用 Xvfb 或其他 X11 显示服务时,才在对应服务文件中设置该变量。

Xvfb 使用 24 位颜色深度。 更低的深度会产生不正确的渲染输出。

监控磁盘使用。 浏览器会把崩溃转储和缓存数据写入 --user-data-dir。设置日志轮换或定期清理,防止磁盘耗尽。

保持依赖更新。 定期运行 apt-get upgrade。库版本不匹配可能导致微妙的渲染问题。

设置资源限制。 使用 systemd 的 MemoryLimitCPUQuota 防止失控实例消耗所有服务器资源。

发布批准

把服务器镜像和 BotBrowser 版本作为一个组合批准。记录 Ubuntu、BotBrowser、配置文件包、图形路径、Xvfb 选择、服务文件和应用版本。分别在冷启动、服务重启和宿主重启后运行代表性任务。

检查普通页面、文字密集页面、截图或文档,以及产品实际使用的媒体。逐步增加并发,并为系统保留资源余量。还应确认监督程序能够记录一次受控失败,并让工作节点返回已知状态。所有目标宿主类别通过后,再推广镜像。

常见问题

BotBrowser 是否支持 Ubuntu 24.04?

支持。某些包名称已更改(例如 libasound2 变为 libasound2t64)。步骤 1 中的替代安装命令涵盖了这些更改。

能否使用更高的 Xvfb 分辨率?

可以。你可以设置 Xvfb :10 -screen 0 2560x1440x24 或任何需要的分辨率。最好匹配配置文件的屏幕分辨率。

服务器需要 GPU 吗?

不需要。BotBrowser 使用配置文件中的 GPU 信息。服务器的实际 GPU(或没有 GPU)不会改变配置文件所表达的设备信息。

为什么不直接用 --headless=new 而不用 Xvfb?

可以直接使用 --headless=new。当目标工作负载依赖 X11 或团队基线已验证 Xvfb 时,再启用 Xvfb 和 DISPLAY。两种路径都应验证页面渲染、媒体和截图。

Headless 启动失败时为什么没有弹窗?

Headless 运行不会显示桌面提示窗口。请读取终端输出并检查配置文件是否存在、有效、未过期且与当前 BotBrowser 主版本匹配。自动化平台应把这类启动消息纳入工作节点日志。

每台服务器能运行多少个实例?

取决于主机和页面工作负载。应使用目标配置文件、图形后端、媒体、截图和工作节点活动测量代表性页面,并为操作系统保留余量。持续监控内存与交换空间压力,在主机失去稳定性前降低并发。

如何检查缺少的库?

运行 ldd /opt/botbrowser/chrome | grep "not found"。任何列为 "not found" 的库都需要安装。使用 apt-file search libname.so 查找提供特定库的包。

BotBrowser 能在 ARM 架构的 Ubuntu 服务器上运行吗?

BotBrowser 提供 x86_64 Linux 构建。ARM 支持取决于具体版本。请查看 GitHub releases 页面 了解可用的架构。

如何更新 BotBrowser?

准备新版本及其匹配的配置文件包。推广前重新检查服务配置、依赖、图形路径和代表性工作负载。完成正常观察周期之前,保留上一批准组合以便回退。

部署决定

在 Ubuntu 服务器上运行 BotBrowser,需要安装系统依赖、选择合适的图形后端并管理服务环境。Xvfb 和 DISPLAY 仅用于选择 X11 虚拟显示的工作负载。容量应根据真实页面和主机资源测量。

容器化部署请参阅Docker 部署指南。大规模性能调优请参阅BotBrowser 性能优化。CLI 标志组合请参阅CLI 配方

#无头模式#Ubuntu#服务器#部署#Linux

让 BotBrowser 从研究走向生产

先用这些指南理解模型,再进入跨平台验证、隔离上下文和面向规模化的浏览器部署。