Ubuntu 24.04 安装 Algernon 1.17.12 指南

Ubuntu 24.04 服务器上以官方二进制安装 Algernon 1.17.12 并用 systemd 托管的全流程实测:下载校验、专用用户、服务单元、故障排查、源码编译备选与升级卸载。

AlgernonAlgernonGoWeb 服务器2026/10/24

Ubuntu 24.04 安装 Algernon 1.17.12 指南

目标:在一台全新的 Ubuntu 24.04 LTS 服务器上,用官方 Linux 二进制完成 Algernon 1.17.12 的下载、安装、systemd 托管、升级与卸载,全程可在裸机或虚拟机复现。主方案为「官方二进制下载 + systemd 托管」;备选方案为「源码编译/包管理器安装」。本文所有命令均在 Ubuntu 24.04.5 LTS(x86_64)服务器环境实测,命令输出为实测回显(已略去终端配色转义符)。

一、环境信息

本篇全部实测在以下环境完成,读者核对时请保持发行版大版本一致,其他发行版的差异点在备选方案中说明:

  • 操作系统:Ubuntu 24.04.5 LTS(x86_64),最小化安装
  • 内核:Linux 6.8(uname -r 可见)
  • 软件版本:Algernon 1.17.12(官方最新稳定版,发布于 2026-10-12;版本信息查询日期 2026-10-24)
  • 网络出口:可访问 GitHub Releases(受限网络可经 HTTP 代理)
  • 初始权限:具备 root 或 sudo 权限的普通用户

先确认基础环境版本:

cat /etc/os-release | head -4
uname -m

实测输出:

PRETTY_NAME="Ubuntu 24.04.5 LTS"
NAME="Ubuntu"
VERSION="24.04.5 LTS (Noble Numbat)"
VERSION_ID="24.04"
x86_64

二、安装步骤(主方案:官方二进制 + systemd)

2.1 安装前置依赖

Algernon 本身是静态编译的单文件二进制,运行不依赖任何系统库。但官方发布包是 .tar.xz 格式,解压需要 xz;下载与后续验证需要 curl。Ubuntu 24.04 最小化安装默认缺 xz-utils(curl 已预装):

apt-get update -qq
apt-get install -y -qq xz-utils curl ca-certificates
which xz curl

实测输出:

/usr/bin/xz
/usr/bin/curl

⚠️ 排障实录:若跳过本步直接解压,会报错 tar (child): xz: Cannot exec: No such file or directory。Algernon 二进制虽是静态的,但发布包的解压工具不是。

2.2 下载官方二进制包

从 GitHub Releases 下载对应平台的发布包。Linux x86_64 的发布物名为 algernon-<版本>-linux_x86_64_static.tar.xz(static 表示静态链接,无 libc 依赖):

cd /tmp
curl -fSL -o algernon.tar.xz https://github.com/xyproto/algernon/releases/download/v1.17.12/algernon-1.17.12-linux_x86_64_static.tar.xz
ls -la algernon.tar.xz
sha256sum algernon.tar.xz

实测输出(大小与校验值):

-rw-r--r-- 1 root root 13305996 Oct 24 11:26 algernon.tar.xz
be2b11a20aa9bd731678076e1f6eb594cf45f8c08e65e13bd2e34c84e8077815  algernon.tar.xz

受限网络环境(直连 GitHub 失败时),可指定 HTTP 代理重试,实测命令:

curl -fsSL -x http://192.168.1.62:7897 -o algernon.tar.xz https://github.com/xyproto/algernon/releases/download/v1.17.12/algernon-1.17.12-linux_x86_64_static.tar.xz

💡 技术拓展:v1.17.12 发布页共提供 14 个发布物,覆盖 Linux(x86_64/aarch64/armv6/armv7)、macOS(x86_64/aarch64)、Windows(x86_64)、FreeBSD 与 NetBSD 的对应架构,均为静态编译单文件。ARM 设备(如树莓派)选 linux_armv7_static 即可,方法与本节完全一致。

2.3 解压并安装到系统路径

tar -tJf algernon.tar.xz

实测输出(包内清单):

algernon-1.17.12-linux_x86_64_static/
algernon-1.17.12-linux_x86_64_static/algernon
algernon-1.17.12-linux_x86_64_static/algernon.1.gz
algernon-1.17.12-linux_x86_64_static/LICENSE

解压并把二进制放到 PATH 中,同时安装 man 手册:

mkdir -p /tmp/algernon-extract
tar -xJf algernon.tar.xz -C /tmp/algernon-extract
cp /tmp/algernon-extract/algernon-1.17.12-linux_x86_64_static/algernon /usr/local/bin/
chmod +x /usr/local/bin/algernon
gzip -d /tmp/algernon-extract/algernon-1.17.12-linux_x86_64_static/algernon.1.gz -c > /usr/share/man/man1/algernon.1

2.4 验证安装

which algernon
algernon --version
du -h /usr/local/bin/algernon
man -w algernon

实测输出:

/usr/local/bin/algernon
Algernon 1.17.12
44M     /usr/local/bin/algernon
/usr/share/man/man1/algernon.1

--version 返回 Algernon 1.17.12 即安装成功。二进制约 44MB,这是「单文件装下整个技术栈」的体积代价,换来的是零外部依赖。

2.5 创建运行用户与站点目录

生产环境不建议用 root 跑 Web 服务。创建无登录 shell 的系统用户,并准备站点目录:

useradd -r -s /usr/sbin/nologin algernon
mkdir -p /srv/algernon
chown -R algernon:algernon /srv/algernon

放入一个最小测试页面(Lua 处理器,Algernon 的默认目录入口文件优先级最高):

cat > /srv/algernon/index.lua <<'EOF'
print("<h1>Hello, Algernon!</h1>")
print("<p>Served by index.lua</p>")
EOF
chown algernon:algernon /srv/algernon/index.lua

2.6 编写 systemd 服务单元

创建 /etc/systemd/system/algernon.service:

cat > /etc/systemd/system/algernon.service <<'EOF'
[Unit]
Description=Algernon web server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=algernon
Group=algernon
WorkingDirectory=/srv/algernon
ExecStart=/usr/local/bin/algernon --httponly --addr=:3000 --noninteractive --boltdb=/var/lib/algernon/algernon.db /srv/algernon
Restart=on-failure
RestartSec=3
StateDirectory=algernon

[Install]
WantedBy=multi-user.target
EOF

参数说明(完整 flag 语义见《Algernon 1.17.12 配置参数详解》):

  • --httponly:只起常规 HTTP,不要求 TLS 证书(内网/反代场景适用);
  • --addr=:3000:监听地址端口;
  • --noninteractive:禁用交互式 REPL。Algernon 默认启动交互解释器,systemd 环境下 stdin 不可用,不加该参数服务会随 stdin 关闭而退出;
  • --boltdb=/var/lib/algernon/algernon.db:显式指定数据库文件位置,配合 StateDirectory=algernon(systemd 自动创建 /var/lib/algernon 并赋予运行用户所有权);
  • 末尾 /srv/algernon 为要服务的站点目录;
  • Restart=on-failure + RestartSec=3:异常退出时自动拉起。

2.7 启动与自启动

systemctl daemon-reload
systemctl enable algernon
systemctl start algernon
systemctl is-active algernon

实测输出:

Created symlink /etc/systemd/system/multi-user.target.wants/algernon.service → /etc/systemd/system/algernon.service.
active

2.8 服务状态与功能验证

systemctl status algernon --no-pager | head -8

实测输出:

● algernon.service - Algernon web server
     Loaded: loaded (/etc/systemd/system/algernon.service; enabled; preset: enabled)
     Active: active (running) since Fri 2026-10-24 12:05:35 UTC; 12s ago
   Main PID: 5201 (algernon)
     Memory: 10.5M (peak: 12.1M)
        CPU: 69ms
     CGroup: /system.slice/algernon.service
             └─5201 /usr/local/bin/algernon --httponly --addr=:3000 --noninteractive --boltdb=/var/lib/algernon/algernon.db /srv/algernon

驻留内存仅 10.5M。HTTP 验证:

curl -s http://localhost:3000/
curl -s -o /dev/null -w "http_code=%{http_code}\n" http://localhost:3000/

实测输出:

<h1>Hello, Algernon!</h1><p>Served by index.lua</p>
http_code=200

三、排障实录

以下是主方案实施过程中真实踩到并排除的两个故障,按现象→定位→处理沉淀。

3.1 服务启动即退出(status=0/SUCCESS)

现象:第一版单元用 ExecStart=/usr/local/bin/algernon --prod --httponly --addr=:3000 ...,systemctl start 后服务立即退出,systemctl status 显示:

Active: inactive (dead)
Process: 4764 ExecStart=/usr/local/bin/algernon --prod --httponly --addr=:3000 --noninteractive /srv/algernon (code=exited, status=0/SUCCESS)

定位:查服务日志:

journalctl -u algernon --no-pager -n 30 | tail -8

实测输出:

Oct 24 12:03:10 algernon-server systemd[1]: algernon.service: Deactivated successfully.
Oct 24 12:03:09 algernon-server algernon[4764]: Could not use Bolt as database backend: open /tmp/algernon.db: permission denied
Oct 24 12:03:09 algernon-server systemd[1]: algernon.service: Deactivated successfully.

Algernon 默认把内置数据库文件放在 /tmp/algernon.db,该文件此前由 root 调试时创建,普通用户 algernon 无权打开;数据库初始化失败后程序以 0 状态码「体面退出」。

处理:两条路任选其一:

  1. 单元中显式指定专用库文件:--boltdb=/var/lib/algernon/algernon.db,并配 StateDirectory=algernon(本文主方案采用);
  2. 或清理 root 遗留的 /tmp/algernon.db(rm /tmp/algernon.db)让专用用户重建。

教训:给 Algernon 配专用运行用户时,务必同步考虑其数据库文件的属主与路径;「服务退出码 0 但没起来」优先查 journalctl 里的数据库初始化日志。

3.2 --prod 与端口 80/443 的权限陷阱

现象:沿用 2.6 的 User=algernon,把启动参数换成 --prod 后服务同样秒退。

定位:手动前台复现:

timeout 4 algernon --prod --httponly --addr=:3000 --noninteractive /srv/algernon

实测输出(节选):

Listening for: HTTP localhost 80 plain / HTTP/2 localhost 443 TLS
Serving HTTP on http://localhost:3000/

--prod 是「生产模式全家桶」:强制监听 80(HTTP)与 443(HTTP/2 TLS)、切换默认站点目录为 /srv/algernon、读取 /etc/algernon/cert.pem 与 /etc/algernon/key.pem 证书。非 root 用户绑定 80/443 会直接失败。

处理:生产确需 80/443 时,要么服务单元保持 User=root(不推荐),要么授予二进制端口能力后仍以普通用户运行:

setcap 'cap_net_bind_service=+ep' /usr/local/bin/algernon

教训:--prod 会忽略 --addr 的常规意图并接管端口与证书路径,systemd 托管 + 普通用户的组合建议从 --httponly --addr=:3000 起步,再按需演进。

四、备选方案

4.1 包管理器安装(Arch Linux / macOS)

官方 README「Distro Packages」一节列出的渠道(本篇在 Ubuntu 上实测主方案;Arch/macOS 命令为官方文档口径):

# Arch Linux(官方仓库)
pacman -S algernon
# macOS(Homebrew)
brew install algernon

Ubuntu/Debian 官方仓库暂无 algernon 包,Ubuntu 上请使用主方案二进制安装。

4.2 源码编译(需 Go ≥ 1.26)

适合需要自定义构建或内网无外网分发的场景。官方 README「Building」一节给出的步骤:

apt-get install -y -qq golang-go
go version   # 需 >= 1.26
git clone https://github.com/xyproto/algernon
cd algernon
go build -mod=vendor
# 产物为当前目录下的 algernon 可执行文件

编译产物仍是单文件二进制,后续 systemd 托管步骤与主方案 2.5~2.8 完全一致。Ubuntu 24.04 仓库自带的 Go 为 1.22,版本不足时需从 go.dev 安装新版 Go 再编译。

五、升级与卸载

5.1 升级

Algernon 无内置自动更新。升级即「换二进制」:

cd /tmp
curl -fSL -o algernon-new.tar.xz https://github.com/xyproto/algernon/releases/download/<新版本号>/algernon-<新版本号>-linux_x86_64_static.tar.xz
tar -xJf algernon-new.tar.xz -C /tmp/algernon-extract
systemctl stop algernon
cp /tmp/algernon-extract/algernon-<新版本号>-linux_x86_64_static/algernon /usr/local/bin/
systemctl start algernon
systemctl is-active algernon
algernon --version

站点目录、数据库文件与 systemd 单元在升级间保持不变;数据库若使用 BoltDB/Redis,会按需自动完成结构迁移。降级同理,把版本号换成旧版即可。升级前建议用 cp /usr/local/bin/algernon /usr/local/bin/algernon.bak 留一份回退副本。

5.2 卸载

systemctl disable --now algernon
rm /etc/systemd/system/algernon.service
systemctl daemon-reload
rm /usr/local/bin/algernon /usr/share/man/man1/algernon.1
userdel algernon
rm -rf /srv/algernon /var/lib/algernon

实测输出(disable 时):

Removed "/etc/systemd/system/multi-user.target.wants/algernon.service".

六、常见问题 FAQ

Q1:下载发布包时解压报 xz: Cannot exec? 最小化安装缺 xz-utils,执行 apt-get install -y xz-utils(见 2.1 排障实录)。

Q2:systemctl start 后服务 inactive (dead),退出码 0? 九成是数据库文件权限(/tmp/algernon.db)问题,看 journalctl -u algernon 中是否有 Could not use Bolt as database backend;按 3.1 处理。

Q3:前台跑得好好的,放后台就退出并打印 bye? Algernon 默认进交互式 REPL,stdin 关闭即退出。后台/服务场景必须加 --noninteractive(或 -s)。

Q4:需要监听 80/443 但以普通用户运行失败? --prod 模式绑定特权端口,非 root 需 setcap 'cap_net_bind_service=+ep' /usr/local/bin/algernon(见 3.2)。

Q5:ARM 板子能跑吗? 能。Releases 提供 linux_armv6/armv7/aarch64 静态二进制,安装步骤与本文一致。

Q6:怎么只静默跑着、日志全关? -q(--quiet)可完全静默;仍要保留少量日志时用 --accesslog/--ncsa 指定日志文件。注意 -n(--nobanner)在本版本实测中仍会打印横幅,追求无输出请用 -q。

七、参考链接

  1. 官方 Releases(v1.17.12 发布页与资产列表):https://github.com/xyproto/algernon/releases/tag/v1.17.12
  2. 官方 README(Building / Distro Packages / Docker 章节):https://github.com/xyproto/algernon
  3. 本专栏姊妹篇:《Algernon 1.17.12 介绍与选型指南》

站内相关:《Caddy 2.11 介绍与选型指南》。