Ubuntu 22.04 安装 Prosody IM 13.0.7 指南
Ubuntu 22.04 从零安装 Prosody IM 13.0.7 实战:官方 packages.prosody.im 仓库添加、Lua 5.1→5.4 解释器修正、自签证书与证书归位、systemd 托管、端口验证与管理员账号 XMPP 登录全链路实测,含 7 条排障实录。
Ubuntu 22.04 安装 Prosody IM 13.0.7 指南
目标:在一台 Ubuntu 22.04 服务器上从零安装 Prosody IM 13.0.7(官方 packages.prosody.im 仓库主线方案),完成证书签发、管理员账号注册、systemd 服务托管与 XMPP 客户端登录的全链路验证。已在 Ubuntu 22.04.5 LTS(x86_64)实测通过,全部命令与回显均为真实执行记录。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64,GNU/Linux 5.15 内核);
- 软件版本:Prosody IM 13.0.7(官方仓库包名
13.0.7-1~jammy2,安装时dpkg -s prosody显示Version: 13.0.7-1~jammy2); - 运行时:Lua 5.4.4(Ubuntu 22.04 jammy 仓库版本);
- 示例 XMPP 域名:
xmpp.example.com(正文统一以此域演示,实际部署替换为你的真实域名); - 示例管理员账号:
admin@xmpp.example.com,密码q1w2e3r4; - 服务端口:5222(客户端 c2s)、5269(服务器互联 s2s)、5280(HTTP/BOSH,可选启用);
- 关键路径:配置
/etc/prosody/prosody.cfg.lua、数据/var/lib/prosody/、日志/var/log/prosody/、证书目录/etc/prosody/certs/; - 网络前提:服务器可访问
archive.ubuntu.com与packages.prosody.im;若从国内访问缓慢,可为 apt 配置代理或使用镜像仓库(本文按可直连环境实录)。
💡 说明:
xmpp.example.com需要有 DNS A 记录指向本服务器 IP 才能被客户端与联邦服务器访问;无 DNS 的测试环境可在服务器/etc/hosts中加一行127.0.0.1 xmpp.example.com模拟解析,本文实测即采用此方式。
二、前置条件
2.1 系统与权限
- 一台 Ubuntu 22.04 服务器(物理机/云主机均可),具有 root 或 sudo 权限;
- 开放防火墙端口:5222/TCP(客户端连接)、5269/TCP(服务器联邦,可选)、5280/TCP(HTTP 绑定,可选)。使用 ufw 的话:
ufw allow 5222/tcp # 放行客户端 c2s 端口
2.2 基础工具
最小化安装的 Ubuntu 缺少下载与证书工具,先补齐(缺 wget 直接做后面步骤会报错,见第九章 FAQ-1):
apt-get update && apt-get install -y wget ca-certificates gnupg
实测回显(节选末尾):
Running hooks in /etc/ca-certificates/update.d...
done.
2.3 域名解析
检查域名是否解析到本机(真实环境应有 A 记录):
getent hosts xmpp.example.com || echo "127.0.0.1 xmpp.example.com" >> /etc/hosts
实测回显(无 DNS 环境追加 hosts 后):
127.0.0.1 xmpp.example.com
三、版本选型说明
Ubuntu 22.04 上有两条安装来源,版本差异明显(2026-10-21 实测 apt 索引):
apt-cache policy prosody
发行版仓库初始索引下回显:
prosody:
Installed: (none)
Candidate: 0.11.13-1
Version table:
0.11.13-1 500
500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
添加官方仓库后(见第四章)再查:
prosody:
Installed: (none)
Candidate: 13.0.7-1~jammy2
Version table:
13.0.7-1~jammy2 500
500 http://packages.prosody.im/debian jammy/main amd64 Packages
0.11.13-1 500
500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
关键差异:Ubuntu jammy 官方仓库停留在 0.11.13(2020 年代的旧线,Prosody 13 的诸多新能力——内置 invites 邀请注册体系、prosodyctl shell 管理外壳、SMACKS v3 流恢复增强等——均不可用),而官方 packages.prosody.im 仓库与上游同步,jammy 套件直供 13.0.7-1~jammy2。本文主线采用官方仓库方案(B),发行版仓库方案(A)仅作无外网策略下的兜底。
官方仓库同时提供两类包(来源:prosody.im/download/package_repository):
| 包名 | 内容 | 适用策略 |
|---|---|---|
prosody | 始终对齐最新稳定版,含跨大版本升级 | 追新,配合 apt-mark hold 控制升级节奏 |
prosody-13.0 | 锁定 13.0 分支的 nightly 构建,只收 bug 修复 | 求稳,避免自动升级引入大版本变更 |
四、安装方案 A:Ubuntu 发行版仓库(兜底)
本方案直接使用 Ubuntu 自带仓库,适合无法添加第三方仓库的环境,但版本老(0.11.13),仅作兜底,不推荐生产使用。
apt-get install -y prosody
安装后确认版本:
dpkg -s prosody | grep ^Version
预期回显(该方案下版本为发行版自带):
Version: 0.11.13-1
⚠️ 注意:0.11.x 与 13.0.x 的配置项与模块生态存在代差(如 13.0 起不再兼容 Lua 5.1、默认启用 invites 模块族)。若从 0.11 升级到 13.0,请先阅读官方版本说明再迁移配置。
五、安装方案 B:官方 packages.prosody.im 仓库(推荐主线)
本方案是官方推荐路径:一条 wget 命令引入官方仓库定义文件(签名公钥内置于该文件,无需 apt-key),随后照常 apt 安装即可获得与上游同步的最新版。
5.1 添加官方仓库
wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O /etc/apt/sources.list.d/prosody.sources
实测回显:
--2026-10-21 10:05:42-- https://prosody.im/downloads/repos/jammy/prosody.sources
Resolving prosody.im (prosody.im)... 176.126.242.74, 2a00:1098:3a0::1
Connecting to prosody.im (prosody.im)|176.126.242.74|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6678 (6.5K) [application/octet-stream]
Saving to: '/etc/apt/sources.list.d/prosody.sources'
0K ...... 100% 7.77G=0s
查看仓库定义文件头部的关键信息(完整文件内嵌 Prosody 官方签名公钥):
head -5 /etc/apt/sources.list.d/prosody.sources
实测回显:
Suites: jammy
Types: deb
Architectures: amd64 armhf arm64
Components: main
Uris: http://packages.prosody.im/debian
💡 技术拓展:
prosody.sources是 Debian 新版 deb822 格式(区别于旧的deb http://... main单行格式)。密钥管理方式对比——
方式 原理 现状 apt-key add(旧) 密钥装入全局信任库 Debian 11+/Ubuntu 22.04 已弃用,apt 会告警 signed-by 独立密钥文件 每仓库独立密钥,互不放大信任面 当前推荐 deb822 内嵌 Signed-By 密钥直接写进 .sources 文件 官方仓库采用,一份文件即全部 官方自 2025-08-04 起切换到新签名密钥,prosody.sources 文件已内嵌新钥;旧系统若沿用旧 key 会在
apt update时报NO_PUBKEY F7A37EB33D0B25D7(解决方法见 FAQ-3)。
5.2 刷新索引并确认版本
apt-get update
实测回显(节选 prosody 仓库相关行):
Get:4 http://packages.prosody.im/debian jammy InRelease [7739 B]
Get:6 http://packages.prosody.im/debian jammy/main armhf Packages [1823 B]
Get:7 http://packages.prosody.im/debian jammy/main arm64 Packages [1830 B]
Get:8 http://packages.prosody.im/debian jammy/main amd64 Packages [1832 B]
apt-cache policy prosody | head -5
实测回显:
prosody:
Installed: (none)
Candidate: 13.0.7-1~jammy2
Version table:
13.0.7-1~jammy2 500
5.3 安装
DEBIAN_FRONTEND=noninteractive apt-get install -y prosody
实测回显(节选依赖设置末尾部分):
Setting up liblua5.1-0-dev:amd64 (5.1.5-8.1build4) ...
Setting up libtool (2.4.6-15build2) ...
Setting up luarocks (3.8.0+dfsg1-1) ...
Setting up gcc (4:11.2.0-1ubuntu1~22.04.3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.14) ...
确认包版本:
dpkg -s prosody | grep ^Version
实测回显:
Version: 13.0.7-1~jammy2
⚠️ 注意:依赖链中出现的
luarocks/gcc/liblua5.1-0-dev是官方包 Recommends 拉入的模块构建工具链(便于后续编译安装社区模块)。若想最小化安装,可加--no-install-recommends,代价是prosodyctl plugins install安装社区模块时需要手动补齐构建工具。
六、安装后必做:修正默认 Lua 解释器
这是 Ubuntu 22.04 上安装 Prosody 13 的第一个必踩坑。安装完成后直接运行 prosody --version 或启动服务会报错:
prosody --version
实测回显:
Prosody is no longer compatible with Lua 5.1
See https://prosody.im/doc/depends#lua for more information
6.1 定位
/usr/bin/prosody 的首行 shebang 是 #!/usr/bin/env lua,即使用系统默认 lua 命令。查看系统内 Lua 解释器候选与优先级:
update-alternatives --display lua-interpreter | head -8
实测回显:
lua-interpreter - auto mode
link best version is /usr/bin/lua5.1
link currently points to /usr/bin/lua5.1
link lua-interpreter is /usr/bin/lua
slave lua-manual is /usr/share/man/man1/lua.1.gz
/usr/bin/lua5.1 - priority 110
slave lua-manual: /usr/share/man/man1/lua5.1.1.gz
/usr/bin/lua5.4 - priority 20
根因:apt-get install prosody 会按包依赖装入 lua5.4(Depends: lua5.4),但随 luarocks 引入的 lua5.1 在 alternatives 机制中优先级更高(110 对 20),auto 模式下 /usr/bin/lua 被解析到 lua5.1,而 Prosody 13.x 启动脚本检测到 _VERSION < "Lua 5.2" 即退出。
6.2 修复:把默认 Lua 切到 5.4
update-alternatives --set lua-interpreter /usr/bin/lua5.4
实测回显:
update-alternatives: using /usr/bin/lua5.4 to provide /usr/bin/lua (lua-interpreter) in manual mode
update-alternatives: warning: skip creation of /usr/share/man/man1/lua.1.gz because associated file /usr/share/man/man1/lua5.4.1.gz (of link group lua-interpreter) doesn't exist
验证(man 页警告可忽略,不影响运行):
lua -v
实测回显:
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
再次确认 prosody 以 Lua 5.4 正常加载(用 prosodyctl about,root 直跑 prosody 会触发官方 root 保护而拒绝执行):
prosodyctl about | head -2
实测回显:
Prosody 13.0.7
Lua version: Lua 5.4
⚠️ 注意:以 root 运行
prosody --version会得到官方保护告警并以退出码 1 结束(实测回显如下),这是官方防呆设计,不代表安装失败;版本确认一律用prosodyctl about或dpkg -s prosody。Danger, Will Robinson! Prosody doesn't need to be run as root, so don't do it! For more information on running Prosody as root, see https://prosody.im/doc/root
七、服务托管与首次启动
7.1 systemd 服务管理
Prosody 安装后注册为 systemd 服务(unit:prosody.service,开机自启默认 enabled):
systemctl enable prosody
实测回显(已处于自启状态时):
Synchronizing state of prosody.service with SysV service script with /lib/systemd/systemd-sysv-install.
启动服务:
systemctl start prosody
systemctl is-active prosody
实测回显:
active
日常管理命令(逐条):
systemctl status prosody # 查看服务状态与最近日志
systemctl restart prosody # 重启(加载全新进程)
systemctl reload prosody # 平滑重载配置(对支持热加载的配置项生效)
journalctl -u prosody -n 20 # 查看 systemd 视角最近 20 行日志
7.2 监听端口验证
ss -ltnp | grep -E "5222|5269"
实测回显:
LISTEN 0 128 0.0.0.0:5222 0.0.0.0:* users:(("lua",pid=4272,fd=16))
LISTEN 0 128 0.0.0.0:5269 0.0.0.0:* users:(("lua",pid=4272,fd=14))
LISTEN 0 128 [::]:5222 [::]:* users:(("lua",pid=4272,fd=15))
LISTEN 0 128 [::]:5269 [::]:* users:(("lua",pid=4272,fd=13))
💡 说明:5222(c2s 客户端接入)与 5269(s2s 服务器互联)默认开启;5280(HTTP 绑定)默认未监听,启用方法见配置篇。进程名显示为
lua是因为 Prosody 以 Lua 解释器运行,属正常现象。
八、域名、证书与管理员账号
8.1 配置示例域名
编辑 /etc/prosody/prosody.cfg.lua(Prosody 的唯一主配置文件,语法为 Lua),做两处修改:
- 将
admins = { }改为(第 25 行附近):
admins = { "admin@xmpp.example.com" }
- 将文件末尾的
VirtualHost "localhost"改为:
VirtualHost "xmpp.example.com"
修改后核对生效行:
grep -nE "^admins|^VirtualHost" /etc/prosody/prosody.cfg.lua
实测回显:
25:admins = { "admin@xmpp.example.com" }
216:VirtualHost "xmpp.example.com"
8.2 生成自签证书
内网或无 Let's Encrypt 条件的环境,用内置命令为域名签发一年期自签证书:
prosodyctl cert generate xmpp.example.com
实测回显(交互式,直接回车取默认值):
Choose key size (2048): Key written to /var/lib/prosody/xmpp.example.com.key
Please provide details to include in the certificate config file.
Leave the field empty to use the default value or '.' to exclude the field.
countryName (GB): localityName (The Internet): organizationName (Your Organisation): organizationalUnitName (XMPP Department): commonName (xmpp.example.com): emailAddress (xmpp@xmpp.example.com):
Config written to /var/lib/prosody/xmpp.example.com.cnf
Certificate written to /var/lib/prosody/xmpp.example.com.crt
💡 技术拓展:生产服务器证书来源对比——
来源 原理 适用 自签(prosodyctl cert generate) 本地自签发,客户端需信任或忽略校验 内网、测试 Let's Encrypt(certbot) ACME 域名验证自动签发,90 天滚动续期 公网域名,标准选择 商业 CA 证书 购买签发,有效期长 有合规要求的企业 自签证书仅服务端 TLS 可用(联邦 s2s 场景对端会校验失败);公网生产建议 certbot 签发后将证书路径配置到 Prosody(见配置篇)。
8.3 证书归位与健康检查
prosodyctl check 的证书检查只扫描 /etc/prosody/certs/ 目录,而 cert generate 把证书写在 /var/lib/prosody/,需复制归位:
cp /var/lib/prosody/xmpp.example.com.crt /var/lib/prosody/xmpp.example.com.key /etc/prosody/certs/
chown root:prosody /etc/prosody/certs/xmpp.example.com.*
chmod 640 /etc/prosody/certs/xmpp.example.com.*
复制后必须重启服务,新证书才会被 TLS 层加载(否则 TLS 握手报 no shared cipher,见 FAQ-2):
systemctl restart prosody
systemctl is-active prosody
实测回显:
active
运行官方健康检查:
prosodyctl check
实测回显(节选,省略 DNS 建议之前的配置检查段):
Checking DNS for host xmpp.example.com...
Host xmpp.example.com does not seem to resolve to this server (IPv4/IPv6)
Checking certificates...
Checking certificate for xmpp.example.com
Certificate: /etc/prosody/certs/xmpp.example.com.crt
All checks passed, congratulations!
💡 说明:DNS 检查项提示域名未解析到本机,是因为本文实验环境用 /etc/hosts 模拟(
prosodyctl check走 DNS 解析对比公网记录);公网服务器配好 A 记录后该项自然通过。证书项已由警告(FAQ-2 场景)变为明确路径加载。
8.4 注册管理员账号
prosodyctl register admin xmpp.example.com q1w2e3r4
实测回显:
usermanager info User account created: admin@xmpp.example.com
8.5 端到端登录验证
用任一标准 XMPP 客户端(Gajim、Conversations、Dino 等)以 admin@xmpp.example.com / q1w2e3r4 登录 xmpp.example.com(5222 端口)。本文用 Python 标准库脚本模拟客户端完成 STARTTLS→SASL→资源绑定→服务发现全链路,实测关键回显:
[tls] 协议=TLSv1.3 密码套件=TLS_AES_256_GCM_SHA384
[auth] << <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
[bind] << <iq type='result' id='b1'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>admin@xmpp.example.com/pytest</jid></bind></iq>
[done] 登录+bind+disco 全链路完成
其中 disco#info 响应含服务器身份宣告(节选):
<identity type='im' name='Prosody' category='server'/>
登录、TLSv1.3 加密、SASL 认证、资源绑定全部通过,部署验证完成。
九、常见问题(FAQ)
FAQ-1:wget: command not found
现象:执行仓库添加命令报 bash: line 1: wget: command not found。
定位:Ubuntu 22.04 最小安装不带 wget。
解决:
apt-get update && apt-get install -y wget ca-certificates
FAQ-2:TLS 握手失败 no shared cipher
现象:客户端连 5222 报握手失败,服务日志 /var/log/prosody/prosody.log 出现 Client disconnected: no shared cipher。
定位:证书复制到 /etc/prosody/certs/ 后未重启服务,TLS 层仍持有旧的证书上下文;或 prosodyctl check 报 No 'certificate' found for xmpp.example.com 时放任未处理。
解决:按 8.3 节把 crt/key 复制进 certs 目录并 chown root:prosody、chmod 640,然后 systemctl restart prosody。重启后日志出现 xmpp.example.com:tls info Certificates loaded,握手恢复 TLSv1.3。
FAQ-3:apt update 报 NO_PUBKEY F7A37EB33D0B25D7
现象:
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://packages.prosody.im/debian jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F7A37EB33D0B25D7
定位:官方 2025-08-04 切换包签名密钥,旧系统沿用的旧 key 不再受信(来源:prosody.im/download/package_repository)。
解决:删除旧的 prosody source 条目与旧 key,重新下载内置新钥的 prosody.sources(官方推荐做法):
rm -f /etc/apt/sources.list.d/prosody.list
wget https://prosody.im/downloads/repos/$(lsb_release -sc)/prosody.sources -O /etc/apt/sources.list.d/prosody.sources
apt-get update
FAQ-4:启动报 Prosody is no longer compatible with Lua 5.1
见第六章:update-alternatives --set lua-interpreter /usr/bin/lua5.4 切换默认解释器后重启服务即可。补充说明:该坑源于 jammy 的 alternatives 打包优先级(lua5.1 为 110、lua5.4 仅 20),未来 Ubuntu 版本可能修正;升级 Prosody 前先跑 lua -v 核对版本可提前规避。
FAQ-5:prosodyctl cert generate 提示 .cnf exists, do you want to replace it? 后卡住
现象:重复生成证书时交互询问 y/n,脚本化调用(stdin 关闭)会中断退出,证书未生成。
解决:删除旧的三件套后重新生成:
rm -f /var/lib/prosody/xmpp.example.com.crt /var/lib/prosody/xmpp.example.com.key /var/lib/prosody/xmpp.example.com.cnf
prosodyctl cert generate xmpp.example.com
FAQ-6:老客户端(sendxmpp 等)登录失败
现象:Perl 系老客户端 sendxmpp 登录时输出大量 Use of uninitialized value $sid 警告并以 Error 'AuthSend' 失败。
定位:sendxmpp 依赖的 Net::XMPP 库年代久远,对 Prosody 13 默认要求的 STARTTLS(流特性中宣告 <required/>)与现代 SCRAM 认证兼容性差。
解决:改用现代客户端(Gajim/Conversations/Dino)或脚本化场景用 Python(slixmpp/aioxmpp)或标准库自实现流;服务端不建议为兼容老客户端而关闭 TLS 强制(c2s_require_encryption = false),安全代价过高。
FAQ-7:卸载时报 userdel: user prosody is currently used by process
现象:服务运行中直接 apt-get remove --purge prosody,末尾出现:
Purging configuration files for prosody (13.0.7-1~jammy2) ...
userdel: user prosody is currently used by process 4769
groupdel: cannot remove the primary group of user 'prosody'
dpkg: warning: while removing prosody, directory '/var/lib/prosody' not empty so not removed
dpkg: warning: while removing prosody, directory '/etc/prosody/certs' not empty so not removed
定位:卸载时服务进程仍持有 prosody 用户与数据目录。
解决:先停服务再卸载(见第十章标准卸载流程);残留目录可手动确认后删除。
十、升级、多版本与卸载
10.1 升级
官方仓库方案下升级随系统更新完成:
apt-get update && apt-get upgrade prosody
跨大版本(如 0.12→13.0)前务必阅读官方发布说明(prosody.im/doc/release),13.0 起有配置项与模块变更(如不再兼容 Lua 5.1)。
10.2 锁定版本(防止自动升级引入大版本变更)
官方对 prosody 包「始终跟随最新稳定版」的提示性建议(来源:prosody.im/download/package_repository):
apt-mark hold prosody # 锁定
apt-mark showhold # 查看锁定列表
apt-mark unhold prosody # 解锁
实测回显:
prosody set on hold.
prosody
Canceled hold on prosody.
若希望只收 13.0 分支的修复而完全规避跨大版本自动升级,可改装分支包 prosody-13.0(每夜构建、无破坏性变更)。
10.3 已安装版本与文件清单核对
apt-cache madison prosody
实测回显:
prosody | 13.0.7-1~jammy2 | http://packages.prosody.im/debian jammy/main amd64 Packages
prosody | 0.11.13-1 | http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
dpkg -L prosody | wc -l
实测回显:
745
10.4 卸载与清理
标准卸载流程(先停服务,避免 FAQ-7):
systemctl stop prosody
apt-get remove --purge -y prosody
apt-get autoremove -y
残留数据与配置目录(purge 不删除非空目录,卸载后按需清理):
rm -rf /var/lib/prosody /var/log/prosody /etc/prosody
rm -f /etc/apt/sources.list.d/prosody.sources
⚠️ 注意:
rm -rf /var/lib/prosody会删除全部账号数据与消息归档,生产环境执行前必须先备份。
十一、参考链接
- 官方包仓库说明(prosody.sources、签名密钥切换):https://prosody.im/download/package_repository
- 官方下载页(各平台安装指引):https://prosody.im/download
- 官方安装文档:https://prosody.im/doc/install
- 证书文档:https://prosody.im/doc/certificates
- Lua 依赖说明:https://prosody.im/doc/depends
- DNS 与端口要求:https://prosody.im/doc/dns
- systemd 服务单元:/lib/systemd/systemd 管辖 prosody.service(
systemctl cat prosody可查看) - 本专栏同系列:配置详解与 CLI 命令详解篇(见 Prosody IM 专栏列表)。