ejabberd 原生支持在一个实例上运行多个 XMPP 域名,只要在 ejabberd.yml 的 hosts 列表里声明多个域名,再分别配置证书和认证方式,就能让同一台服务器同时服务 example.com 和 example.net。
ejabberd 支持多个域名吗?先理解虚拟主机机制
ejabberd 不是按物理服务器来划分域,而是通过“虚拟主机”概念管理多个 XMPP 域,配置文件里的 hosts 字段就定义了这台服务器对哪些域负责,默认安装后往往只有 localhost,很多人以为只能跑一个域,其实不是,hosts 可以写成一串。
hosts: - "example.com" - "example.net" - "im.example.org"
每个域名对应一个独立的 XMPP 域,用户 JID 会变成 user@example.com、user@example.net,即使密码一样,也是不同账号,这套机制跟 Web 服务器的虚拟主机很像,只是 ejabberd 在 XMPP 层做了隔离。
这里有一个前提:DNS,域名必须解析到 ejabberd 所在服务器,如果只是本地测试,可以改客户端 hosts 文件指向服务器 IP,不然客户端连不上。
ejabberd 多域名配置方法:从 hosts 到证书一次说清
先在 hosts 里声明所有要服务的域名
编辑 /etc/ejabberd/ejabberd.yml,找到 hosts 字段,添加多个域名后保存,注意 YAML 格式,横线后面要有空格,域名要加引号。
证书不能只配一张单域名证书
XMPP 客户端连接 5222 端口时,通常会带 SNI 信息,ejabberd 会根据 SNI 从 certfiles 列表里匹配证书,如果只有一个域名证书,另一个域名客户端会报证书不匹配,配置示例:
certfiles: - "/etc/ejabberd/certs/example.com.pem" - "/etc/ejabberd/certs/example.net.pem"
每个 .pem 文件包含证书私钥和证书链,用 ejabberdctl 的 ACME 自动签发时,可以执行:
sudo ejabberdctl request-cert example.com sudo ejabberdctl request-cert example.net
它会自动配置好证书路径,手动证书放到 certfiles 里后执行 reload_config 即可。
不同域名可以走不同认证后端
这是多域名最实用的地方之一,example.com 是内部员工账号,用 internal 或者 LDAP;example.net 给外部客户,用 SQL 数据库,配置用 host_config 单独覆盖:
host_config:
"example.net":
auth_method: sql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd"
sql_password: "secret"
这样 example.com 保持默认 internal,example.net 走 SQL,还可以给某个域开 anonymous 注册,适合临时会议域或公共聊天室域。
国内服务器部署 ejabberd 多域名,证书和网络这些坑要避开
国内服务器部署多域名时,很多人卡在证书和端口策略上,云厂商提供的免费证书通常是单域名,两个域名就要申请两张,证书管理不复杂但路径容易写错,如果域名超过三个,通配符证书价格会比多个单域名证书更划算,但通配符只覆盖同一级子域,不能跨不同主域,example.com 和 example.net 这种组合得用多域名证书,业内专家指出,ejabberd 的 certfiles 对证书类型没有特殊限制,PEM 格式即可,关键是私钥权限要设置正确。
网络方面,XMPP 常用端口是 5222 客户端到服务器、5269 服务器到服务器、5280 管理后台,国内云服务器安全组默认可能只放通 22 和 443,5222 经常被挡在外面,部署完成后如果客户端连不上,先检查安全组是否放行 TCP 5222,另外部分机房对非标准端口没有过多限制,但域名如果要做 HTTP 管理后台,443 端口需要备案。
多域名证书费用与选型思路
证书类型会影响 ejabberd 多域名的维护成本,下面这张表把几种常见组合放在一起对比。
| 证书类型 | 适用域名组合 | 维护成本 | 典型场景 |
| 单域名证书 x N | example.com、example.net 等不同主域 | 每加一个域要申请一次 | 域名少、预算有限 |
| 通配符证书 | .example.com 这类同一主域 | 一次覆盖多个子域 | 子域名多,主域统一 |
| 多域名证书 | 多个不同主域可合并一张 | 一张证书管理多个域 | 不同品牌或不同公司域 |
多数情况下,两个不同主域用两张单域名证书就够了,当域名数量变多,再考虑多域名证书也不迟。
ejabberd 多域名和单域名对比:什么时候应该拆成两个实例
这是架构决策,多域名虚拟主机和单域名实例的差异主要在资源隔离和维护复杂度上。
- 多域名虚拟主机:一个 ejabberd 节点服务多个域,内存和 CPU 共用,证书和认证配置可以按域区分,适合用户量不大、团队运维人员少、多个小域共存。
- 多实例部署:每个域一个 ejabberd 进程,故障隔离好,升级可以分批,但机器资源占用多,维护量增加。
- 单域名实例:最简单,但没有多租户能力,新增一个域就要再装一套。
行业共识认为,如果总用户数在几千到几万之间,多个域共用一个 ejabberd 节点完全够用;如果某个域用户量大、消息吞吐高,或认证系统完全不同且经常变更,拆实例更稳。
实操:从零配置 ejabberd 多域名完整流程
安装 ejabberd
Ubuntu 或 Debian 上可以用官方仓库安装:
sudo apt update sudo apt install ejabberd
安装完成后配置文件默认在 /etc/ejabberd/ejabberd.yml。
声明多个域名
修改 hosts 字段,示例:
hosts: - "chat.example.com" - "im.example.net"
配置证书并加载
把证书文件放到 /etc/ejabberd/certs/,然后修改 certfiles,或者用 ACME:
sudo ejabberdctl request-cert chat.example.com sudo ejabberdctl request-cert im.example.net sudo ejabberdctl reload_config
创建测试用户
sudo ejabberdctl register alice chat.example.com password123 sudo ejabberdctl register bob im.example.net password123
测试客户端登录时,用户名框填完整 JID,不要只填 alice。
验证多域名是否生效
sudo ejabberdctl status sudo ejabberdctl registered_users chat.example.com
查看两个域的用户列表是否独立,证书验证可以用:
openssl s_client -connect chat.example.com:5222 -servername chat.example.com -starttls xmpp
如果返回的证书主题与域名匹配,说明 SNI 生效。
日志和权限排查清单
- PEM 文件权限必须让 ejabberd 进程可读,通常设置为 root:ejabberd 加 640。
- SQL 认证域需要确保数据库账号对 ejabberd 所需表有权限。
- reload_config 只重新加载配置,不中断现有连接。
- 涉及端口或监听地址修改才需要 restart。
- 日志路径 /var/log/ejabberd/ 可以快速查看证书或认证报错。
ejabberd 多域名不是黑魔法,本质就是 hosts 声明、证书匹配、按域认证三件事,把这三件事理顺,同一个 ejabberd 节点就能稳稳地服务不同的 XMPP 域,既省机器也省维护成本。
ejabberd 多域名常见问题
ejabberd 多域名配置后客户端登录失败怎么排查?
先检查 DNS 是否解析到服务器,再验证 5222 端口是否通,然后看客户端填的 JID 是否完整,user@example.com 而不是只填 user,最后查看 ejabberd 日志,证书不匹配和认证后端错误都会在日志里留下明确记录。
ejabberd 多域名可以共用同一个数据库用户表吗?
可以,多个域名可以同时使用同一个 SQL 数据库,auth_method 都指定为 sql,sql_database 指向同一个库,但要注意 JID 的用户名部分相同、域不同的账号在数据库里是不同记录,因为 ejabberd 会用完整 JID 或用户名加域作为身份标识,具体取决于表结构。
国内服务器上 ejabberd 多域名没有备案会影响 5222 登录吗?
5222 是非 HTTP 端口,多数云厂商的安全组和备案拦截不针对 XMPP 的 5222/5269 端口,只要安全组放行,域名解析正确,未备案通常不影响客户端直接登录,5280 管理后台走 HTTP,如果要通过域名访问 Web 管理界面,域名备案和 80/443 端口策略才需要关注。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/653052.html




